diff options
485 files changed, 24680 insertions, 1809 deletions
diff --git a/configure.exe b/configure.exe Binary files differindex 980c190..9974236 100644..100755 --- a/configure.exe +++ b/configure.exe diff --git a/demos/composition/composition.cpp b/demos/composition/composition.cpp index e03f3e6..deca5dc 100644 --- a/demos/composition/composition.cpp +++ b/demos/composition/composition.cpp @@ -48,6 +48,8 @@ #include <QMouseEvent> #include <qmath.h> +const int animationInterval = 15; // update every 16 ms = ~60FPS + CompositionWidget::CompositionWidget(QWidget *parent) : QWidget(parent) { @@ -236,6 +238,7 @@ CompositionRenderer::CompositionRenderer(QWidget *parent) : ArthurFrame(parent) { m_animation_enabled = true; + m_animationTimer = startTimer(animationInterval); #ifdef Q_WS_QWS m_image = QPixmap(":res/composition/flower.jpg"); m_image.setAlphaChannel(QPixmap(":res/composition/flower_alpha.jpg")); @@ -264,6 +267,20 @@ QRectF rectangle_around(const QPointF &p, const QSizeF &size = QSize(250, 200)) return rect; } +void CompositionRenderer::setAnimationEnabled(bool enabled) +{ + if (m_animation_enabled == enabled) + return; + m_animation_enabled = enabled; + if (enabled) { + Q_ASSERT(!m_animationTimer); + m_animationTimer = startTimer(animationInterval); + } else { + killTimer(m_animationTimer); + m_animationTimer = 0; + } +} + void CompositionRenderer::updateCirclePos() { if (m_current_object != NoObject) @@ -471,10 +488,6 @@ void CompositionRenderer::paint(QPainter *painter) painter->drawImage(0, 0, m_buffer); #endif } - - if (m_animation_enabled && m_current_object == NoObject) { - updateCirclePos(); - } } void CompositionRenderer::mousePressEvent(QMouseEvent *e) @@ -489,6 +502,10 @@ void CompositionRenderer::mousePressEvent(QMouseEvent *e) } else { m_current_object = NoObject; } + if (m_animation_enabled) { + killTimer(m_animationTimer); + m_animationTimer = 0; + } } void CompositionRenderer::mouseMoveEvent(QMouseEvent *e) @@ -500,7 +517,15 @@ void CompositionRenderer::mouseReleaseEvent(QMouseEvent *) { m_current_object = NoObject; - if (m_animation_enabled) + if (m_animation_enabled) { + Q_ASSERT(!m_animationTimer); + m_animationTimer = startTimer(animationInterval); + } +} + +void CompositionRenderer::timerEvent(QTimerEvent *event) +{ + if (event->timerId() == m_animationTimer) updateCirclePos(); } diff --git a/demos/composition/composition.h b/demos/composition/composition.h index 1123531..f5a9fc3 100644 --- a/demos/composition/composition.h +++ b/demos/composition/composition.h @@ -109,10 +109,6 @@ public: void paint(QPainter *); - void mousePressEvent(QMouseEvent *); - void mouseMoveEvent(QMouseEvent *); - void mouseReleaseEvent(QMouseEvent *); - void setCirclePos(const QPointF &pos); QSize sizeHint() const { return QSize(500, 400); } @@ -121,6 +117,12 @@ public: int circleColor() const { return m_circle_hue; } int circleAlpha() const { return m_circle_alpha; } +protected: + void mousePressEvent(QMouseEvent *); + void mouseMoveEvent(QMouseEvent *); + void mouseReleaseEvent(QMouseEvent *); + void timerEvent(QTimerEvent *); + public slots: void setClearMode() { m_composition_mode = QPainter::CompositionMode_Clear; update(); } void setSourceMode() { m_composition_mode = QPainter::CompositionMode_Source; update(); } @@ -150,7 +152,7 @@ public slots: void setCircleAlpha(int alpha) { m_circle_alpha = alpha; update(); } void setCircleColor(int hue) { m_circle_hue = hue; update(); } - void setAnimationEnabled(bool enabled) { m_animation_enabled = enabled; update(); } + void setAnimationEnabled(bool enabled); private: void updateCirclePos(); @@ -177,6 +179,7 @@ private: ObjectType m_current_object; bool m_animation_enabled; + int m_animationTimer; #ifdef QT_OPENGL_SUPPORT QGLPixelBuffer *m_pbuffer; diff --git a/dist/changes-4.6.3 b/dist/changes-4.6.3 new file mode 100644 index 0000000..57cc453 --- /dev/null +++ b/dist/changes-4.6.3 @@ -0,0 +1,159 @@ +Qt 4.6.3 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 4.6.0. For more details, +refer to the online documentation included in this distribution. The +documentation is also available online: + + http://qt.nokia.com/doc/4.6 + +The Qt version 4.6 series is binary compatible with the 4.5.x series. +Applications compiled for 4.5 will continue to run with 4.6. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker, the (now obsolete) Task +Tracker, or the Merge Request queue of the public source repository. + +Qt Bug Tracker: http://bugreports.qt.nokia.com +Task Tracker: http://qt.nokia.com/developer/task-tracker +Merge Request: http://qt.gitorious.org + +**************************************************************************** +* General * +**************************************************************************** + +New features +------------ + + - SomeClass, SomeOtherClass + * New classes for foo, bar and baz + +Optimizations +------------- + + - Optimized foo in QSomeClass + * See list of Important Behavior Changes below + + +**************************************************************************** +* Library * +**************************************************************************** + +QtCore +------ + + - foo + * bar + +QtGui +----- + + - foo + * bar + +QtDBus +------ + + - foo + * bar + +QtNetwork +--------- + + - foo + * bar + +QtOpenGL +-------- + + - foo + * bar + +QtScript +-------- + + - foo + * bar + +QtSql +----- + + - foo + * bar + +QtXml +----- + + - foo + * bar + +Qt Plugins +---------- + + - foo + * bar + +Third party components +---------------------- + + - Updated foo to version 2.3.9. + + - Updated bar to the latest version from baz.org. + + +**************************************************************************** +* Platform Specific Changes * +**************************************************************************** + +Qt for Unix (X11 and Mac OS X) +------------------------------ + + - + +Qt for Linux/X11 +---------------- + + - + +Qt for Windows +-------------- + + - + +Qt for Mac OS X +--------------- + + - + +Qt for Embedded Linux +--------------------- + + - + +DirectFB +-------- + + - + +Qt for Windows CE +----------------- + + - + +**************************************************************************** +* Tools * +**************************************************************************** + + - Designer + * foo + + - qdoc3 + * bar + + - Linguist + * baz + +**************************************************************************** +* Important Behavior Changes * +**************************************************************************** + + - + diff --git a/doc/src/declarative/advtutorial.qdoc b/doc/src/declarative/advtutorial.qdoc index 10c53d5..43dc81e 100644 --- a/doc/src/declarative/advtutorial.qdoc +++ b/doc/src/declarative/advtutorial.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/advtutorial1.qdoc b/doc/src/declarative/advtutorial1.qdoc index 90bac1b..9c6ea71 100644 --- a/doc/src/declarative/advtutorial1.qdoc +++ b/doc/src/declarative/advtutorial1.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/advtutorial2.qdoc b/doc/src/declarative/advtutorial2.qdoc index 1addf45..4fe10c1 100644 --- a/doc/src/declarative/advtutorial2.qdoc +++ b/doc/src/declarative/advtutorial2.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/advtutorial3.qdoc b/doc/src/declarative/advtutorial3.qdoc index d101a98..0c53e74 100644 --- a/doc/src/declarative/advtutorial3.qdoc +++ b/doc/src/declarative/advtutorial3.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/advtutorial4.qdoc b/doc/src/declarative/advtutorial4.qdoc index 059f8bf..ca3b82f 100644 --- a/doc/src/declarative/advtutorial4.qdoc +++ b/doc/src/declarative/advtutorial4.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/anchor-layout.qdoc b/doc/src/declarative/anchor-layout.qdoc index f4db5bf..ff47694 100644 --- a/doc/src/declarative/anchor-layout.qdoc +++ b/doc/src/declarative/anchor-layout.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/animation.qdoc b/doc/src/declarative/animation.qdoc index cfc100d..1acc111 100644 --- a/doc/src/declarative/animation.qdoc +++ b/doc/src/declarative/animation.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/basictypes.qdoc b/doc/src/declarative/basictypes.qdoc index 86485d0..16e0c2e 100644 --- a/doc/src/declarative/basictypes.qdoc +++ b/doc/src/declarative/basictypes.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/declarativeui.qdoc b/doc/src/declarative/declarativeui.qdoc index 6a1b2b1..2bfc3d5 100644 --- a/doc/src/declarative/declarativeui.qdoc +++ b/doc/src/declarative/declarativeui.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/dynamicobjects.qdoc b/doc/src/declarative/dynamicobjects.qdoc index 1d0a5a4..7a489c0 100644 --- a/doc/src/declarative/dynamicobjects.qdoc +++ b/doc/src/declarative/dynamicobjects.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/elements.qdoc b/doc/src/declarative/elements.qdoc index e3323c2..e8fb1e7 100644 --- a/doc/src/declarative/elements.qdoc +++ b/doc/src/declarative/elements.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/example-slideswitch.qdoc b/doc/src/declarative/example-slideswitch.qdoc index c731d4a..79b362e 100644 --- a/doc/src/declarative/example-slideswitch.qdoc +++ b/doc/src/declarative/example-slideswitch.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/examples.qdoc b/doc/src/declarative/examples.qdoc index 46cac07..7de7a19 100644 --- a/doc/src/declarative/examples.qdoc +++ b/doc/src/declarative/examples.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/extending-examples.qdoc b/doc/src/declarative/extending-examples.qdoc index e92fa04..c569ee0 100644 --- a/doc/src/declarative/extending-examples.qdoc +++ b/doc/src/declarative/extending-examples.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/extending.qdoc b/doc/src/declarative/extending.qdoc index c75c22e..e9a7803 100644 --- a/doc/src/declarative/extending.qdoc +++ b/doc/src/declarative/extending.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/focus.qdoc b/doc/src/declarative/focus.qdoc index bb9e1a4..bfbb6af 100644 --- a/doc/src/declarative/focus.qdoc +++ b/doc/src/declarative/focus.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/globalobject.qdoc b/doc/src/declarative/globalobject.qdoc index 00b9cb7..fb33664 100644 --- a/doc/src/declarative/globalobject.qdoc +++ b/doc/src/declarative/globalobject.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/integrating.qdoc b/doc/src/declarative/integrating.qdoc index 43ec33a..b3d6306 100644 --- a/doc/src/declarative/integrating.qdoc +++ b/doc/src/declarative/integrating.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/javascriptblocks.qdoc b/doc/src/declarative/javascriptblocks.qdoc index c2d63b2..cde8eb8 100644 --- a/doc/src/declarative/javascriptblocks.qdoc +++ b/doc/src/declarative/javascriptblocks.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/measuring-performance.qdoc b/doc/src/declarative/measuring-performance.qdoc index 5413c4a..8f6fe7d 100644 --- a/doc/src/declarative/measuring-performance.qdoc +++ b/doc/src/declarative/measuring-performance.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/modules.qdoc b/doc/src/declarative/modules.qdoc index 9eae572..b2fd149 100644 --- a/doc/src/declarative/modules.qdoc +++ b/doc/src/declarative/modules.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/network.qdoc b/doc/src/declarative/network.qdoc index 7b16b53..fc4761e 100644 --- a/doc/src/declarative/network.qdoc +++ b/doc/src/declarative/network.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/propertybinding.qdoc b/doc/src/declarative/propertybinding.qdoc index b42c51f..5d21fd1 100644 --- a/doc/src/declarative/propertybinding.qdoc +++ b/doc/src/declarative/propertybinding.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/qmldebugging.qdoc b/doc/src/declarative/qmldebugging.qdoc index 97bc2f8..c11ff1f 100644 --- a/doc/src/declarative/qmldebugging.qdoc +++ b/doc/src/declarative/qmldebugging.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/qmldocument.qdoc b/doc/src/declarative/qmldocument.qdoc index 907dd10..977b4ac 100644 --- a/doc/src/declarative/qmldocument.qdoc +++ b/doc/src/declarative/qmldocument.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/qmli18n.qdoc b/doc/src/declarative/qmli18n.qdoc index bc64ed7..0803d6c 100644 --- a/doc/src/declarative/qmli18n.qdoc +++ b/doc/src/declarative/qmli18n.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/qmlintro.qdoc b/doc/src/declarative/qmlintro.qdoc index 0a503d7..11a286f 100644 --- a/doc/src/declarative/qmlintro.qdoc +++ b/doc/src/declarative/qmlintro.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/qmlmodels.qdoc b/doc/src/declarative/qmlmodels.qdoc index c898c07..39a09bd 100644 --- a/doc/src/declarative/qmlmodels.qdoc +++ b/doc/src/declarative/qmlmodels.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/qmlreference.qdoc b/doc/src/declarative/qmlreference.qdoc index f52ff41..7caa402 100644 --- a/doc/src/declarative/qmlreference.qdoc +++ b/doc/src/declarative/qmlreference.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/qmlstates.qdoc b/doc/src/declarative/qmlstates.qdoc index 867c714..36a2479 100644 --- a/doc/src/declarative/qmlstates.qdoc +++ b/doc/src/declarative/qmlstates.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/qmlviewer.qdoc b/doc/src/declarative/qmlviewer.qdoc index 79877b9..c2b29d3 100644 --- a/doc/src/declarative/qmlviewer.qdoc +++ b/doc/src/declarative/qmlviewer.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/qtbinding.qdoc b/doc/src/declarative/qtbinding.qdoc index 8b9909e..7857d48 100644 --- a/doc/src/declarative/qtbinding.qdoc +++ b/doc/src/declarative/qtbinding.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/qtdeclarative.qdoc b/doc/src/declarative/qtdeclarative.qdoc index 709c212..41d6338 100644 --- a/doc/src/declarative/qtdeclarative.qdoc +++ b/doc/src/declarative/qtdeclarative.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/qtprogrammers.qdoc b/doc/src/declarative/qtprogrammers.qdoc index a203662..343359c 100644 --- a/doc/src/declarative/qtprogrammers.qdoc +++ b/doc/src/declarative/qtprogrammers.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/scope.qdoc b/doc/src/declarative/scope.qdoc index 470e8f6..5486afd 100644 --- a/doc/src/declarative/scope.qdoc +++ b/doc/src/declarative/scope.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/tutorial.qdoc b/doc/src/declarative/tutorial.qdoc index 54b6610..825590c 100644 --- a/doc/src/declarative/tutorial.qdoc +++ b/doc/src/declarative/tutorial.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/tutorial1.qdoc b/doc/src/declarative/tutorial1.qdoc index b89c74a..3a79a15 100644 --- a/doc/src/declarative/tutorial1.qdoc +++ b/doc/src/declarative/tutorial1.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/tutorial2.qdoc b/doc/src/declarative/tutorial2.qdoc index 3e92e37..4e11f7c 100644 --- a/doc/src/declarative/tutorial2.qdoc +++ b/doc/src/declarative/tutorial2.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/declarative/tutorial3.qdoc b/doc/src/declarative/tutorial3.qdoc index e4d7995..323395e 100644 --- a/doc/src/declarative/tutorial3.qdoc +++ b/doc/src/declarative/tutorial3.qdoc @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/diagrams/contentspropagation/customwidget.py b/doc/src/diagrams/contentspropagation/customwidget.py index 44c7a6e..52a484f 100755 --- a/doc/src/diagrams/contentspropagation/customwidget.py +++ b/doc/src/diagrams/contentspropagation/customwidget.py @@ -5,7 +5,7 @@ ## All rights reserved. ## Contact: Nokia Corporation (qt-info@nokia.com) ## -## This file is part of the test suite of the Qt Toolkit. +## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## No Commercial Usage diff --git a/doc/src/diagrams/contentspropagation/standardwidgets.py b/doc/src/diagrams/contentspropagation/standardwidgets.py index 6c31b71..3ceabf5 100755 --- a/doc/src/diagrams/contentspropagation/standardwidgets.py +++ b/doc/src/diagrams/contentspropagation/standardwidgets.py @@ -5,7 +5,7 @@ ## All rights reserved. ## Contact: Nokia Corporation (qt-info@nokia.com) ## -## This file is part of the test suite of the Qt Toolkit. +## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## No Commercial Usage diff --git a/doc/src/diagrams/programs/mdiarea.py b/doc/src/diagrams/programs/mdiarea.py index d9ed472..bc8864e 100644 --- a/doc/src/diagrams/programs/mdiarea.py +++ b/doc/src/diagrams/programs/mdiarea.py @@ -5,7 +5,7 @@ ## All rights reserved. ## Contact: Nokia Corporation (qt-info@nokia.com) ## -## This file is part of the test suite of the Qt Toolkit. +## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## No Commercial Usage diff --git a/doc/src/diagrams/programs/qpen-dashpattern.py b/doc/src/diagrams/programs/qpen-dashpattern.py index bc8ab05..1b38d23 100644 --- a/doc/src/diagrams/programs/qpen-dashpattern.py +++ b/doc/src/diagrams/programs/qpen-dashpattern.py @@ -5,7 +5,7 @@ ## All rights reserved. ## Contact: Nokia Corporation (qt-info@nokia.com) ## -## This file is part of the test suite of the Qt Toolkit. +## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## No Commercial Usage diff --git a/doc/src/diagrams/programs/standard_views.py b/doc/src/diagrams/programs/standard_views.py index dbb310d..6236a3f 100644 --- a/doc/src/diagrams/programs/standard_views.py +++ b/doc/src/diagrams/programs/standard_views.py @@ -5,7 +5,7 @@ ## All rights reserved. ## Contact: Nokia Corporation (qt-info@nokia.com) ## -## This file is part of the test suite of the Qt Toolkit. +## This file is part of the documentation of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## No Commercial Usage diff --git a/doc/src/objectmodel/signalsandslots.qdoc b/doc/src/objectmodel/signalsandslots.qdoc index 951a396..0f3f618 100644 --- a/doc/src/objectmodel/signalsandslots.qdoc +++ b/doc/src/objectmodel/signalsandslots.qdoc @@ -379,7 +379,7 @@ \section1 Signals And Slots With Default Arguments The signatures of signals and slots may contain arguments, and the - arguments can have defualt values. Consider QObject::destroyed(): + arguments can have default values. Consider QObject::destroyed(): \code void destroyed(QObject* = 0); diff --git a/doc/src/snippets/audio/main.cpp b/doc/src/snippets/audio/main.cpp index 019f208..e21bf75 100644 --- a/doc/src/snippets/audio/main.cpp +++ b/doc/src/snippets/audio/main.cpp @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/doc/src/snippets/code/src_corelib_statemachine_qstatemachine.cpp b/doc/src/snippets/code/src_corelib_statemachine_qstatemachine.cpp index a18971d..1b1abea 100644 --- a/doc/src/snippets/code/src_corelib_statemachine_qstatemachine.cpp +++ b/doc/src/snippets/code/src_corelib_statemachine_qstatemachine.cpp @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the test suite of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage diff --git a/examples/multimedia/audioinput/audioinput.cpp b/examples/multimedia/audioinput/audioinput.cpp index fbf4dc4..b01a396 100644 --- a/examples/multimedia/audioinput/audioinput.cpp +++ b/examples/multimedia/audioinput/audioinput.cpp @@ -48,16 +48,47 @@ #include <QAudioDeviceInfo> #include <QAudioInput> + +#include <QtCore/qendian.h> + #include "audioinput.h" -#define BUFFER_SIZE 4096 +const QString InputTest::PushModeLabel(tr("Enable push mode")); +const QString InputTest::PullModeLabel(tr("Enable pull mode")); +const QString InputTest::SuspendLabel(tr("Suspend recording")); +const QString InputTest::ResumeLabel(tr("Resume recording")); -AudioInfo::AudioInfo(QObject *parent, QAudioInput *device) - :QIODevice(parent) -{ - input = device; +const int BufferSize = 4096; + +AudioInfo::AudioInfo(const QAudioFormat &format, QObject *parent) + : QIODevice(parent) + , m_format(format) + , m_maxAmplitude(0) + , m_level(0.0) - m_maxValue = 0; +{ + switch (m_format.sampleSize()) { + case 8: + switch (m_format.sampleType()) { + case QAudioFormat::UnSignedInt: + m_maxAmplitude = 255; + break; + case QAudioFormat::SignedInt: + m_maxAmplitude = 127; + break; + } + break; + case 16: + switch (m_format.sampleType()) { + case QAudioFormat::UnSignedInt: + m_maxAmplitude = 65535; + break; + case QAudioFormat::SignedInt: + m_maxAmplitude = 32767; + break; + } + break; + } } AudioInfo::~AudioInfo() @@ -84,48 +115,56 @@ qint64 AudioInfo::readData(char *data, qint64 maxlen) qint64 AudioInfo::writeData(const char *data, qint64 len) { - int samples = len/2; // 2 bytes per sample - int maxAmp = 32768; // max for S16 samples - bool clipping = false; - - m_maxValue = 0; - - qint16 *s = (qint16*)data; - - // sample format is S16LE, only! - - for (int i = 0; i < samples; ++i) { - qint16 sample = *s; - s++; - if (abs(sample) > m_maxValue) m_maxValue = abs(sample); + if (m_maxAmplitude) { + Q_ASSERT(m_format.sampleSize() % 8 == 0); + const int channelBytes = m_format.sampleSize() / 8; + const int sampleBytes = m_format.channels() * channelBytes; + Q_ASSERT(len % sampleBytes == 0); + const int numSamples = len / sampleBytes; + + quint16 maxValue = 0; + const unsigned char *ptr = reinterpret_cast<const unsigned char *>(data); + + for (int i = 0; i < numSamples; ++i) { + for(int j = 0; j < m_format.channels(); ++j) { + quint16 value = 0; + + if (m_format.sampleSize() == 8 && m_format.sampleType() == QAudioFormat::UnSignedInt) { + value = *reinterpret_cast<const quint8*>(ptr); + } else if (m_format.sampleSize() == 8 && m_format.sampleType() == QAudioFormat::SignedInt) { + value = qAbs(*reinterpret_cast<const qint8*>(ptr)); + } else if (m_format.sampleSize() == 16 && m_format.sampleType() == QAudioFormat::UnSignedInt) { + if (m_format.byteOrder() == QAudioFormat::LittleEndian) + value = qFromLittleEndian<quint16>(ptr); + else + value = qFromBigEndian<quint16>(ptr); + } else if (m_format.sampleSize() == 16 && m_format.sampleType() == QAudioFormat::SignedInt) { + if (m_format.byteOrder() == QAudioFormat::LittleEndian) + value = qAbs(qFromLittleEndian<qint16>(ptr)); + else + value = qAbs(qFromBigEndian<qint16>(ptr)); + } + + maxValue = qMax(value, maxValue); + ptr += channelBytes; + } + } + + maxValue = qMin(maxValue, m_maxAmplitude); + m_level = qreal(maxValue) / m_maxAmplitude; } - // check for clipping - if (m_maxValue >= (maxAmp - 1)) - clipping = true; - - float value = ((float)m_maxValue/(float)maxAmp); - if (clipping) - m_maxValue = 100; - else - m_maxValue = (int)(value*100); emit update(); - return len; } -int AudioInfo::LinearMax() -{ - return m_maxValue; -} - RenderArea::RenderArea(QWidget *parent) : QWidget(parent) { setBackgroundRole(QPalette::Base); setAutoFillBackground(true); - level = 0; + m_level = 0; setMinimumHeight(30); setMinimumWidth(200); } @@ -139,12 +178,12 @@ void RenderArea::paintEvent(QPaintEvent * /* event */) painter.viewport().top()+10, painter.viewport().right()-20, painter.viewport().bottom()-20)); - if (level == 0) + if (m_level == 0.0) return; painter.setPen(Qt::red); - int pos = ((painter.viewport().right()-20)-(painter.viewport().left()+11))*level/100; + int pos = ((painter.viewport().right()-20)-(painter.viewport().left()+11))*m_level; for (int i = 0; i < 10; ++i) { int x1 = painter.viewport().left()+11; int y1 = painter.viewport().top()+10+i; @@ -157,156 +196,174 @@ void RenderArea::paintEvent(QPaintEvent * /* event */) } } -void RenderArea::setLevel(int value) +void RenderArea::setLevel(qreal value) { - level = value; + m_level = value; repaint(); } InputTest::InputTest() + : m_canvas(0) + , m_modeButton(0) + , m_suspendResumeButton(0) + , m_deviceBox(0) + , m_device(QAudioDeviceInfo::defaultInputDevice()) + , m_audioInfo(0) + , m_audioInput(0) + , m_input(0) + , m_pullMode(false) + , m_buffer(BufferSize, 0) { - QWidget *window = new QWidget; - QVBoxLayout* layout = new QVBoxLayout; + initializeWindow(); + initializeAudio(); +} + +InputTest::~InputTest() {} - canvas = new RenderArea; - layout->addWidget(canvas); +void InputTest::initializeWindow() +{ + QScopedPointer<QWidget> window(new QWidget); + QScopedPointer<QVBoxLayout> layout(new QVBoxLayout); - deviceBox = new QComboBox(this); + m_canvas = new RenderArea(this); + layout->addWidget(m_canvas); + + m_deviceBox = new QComboBox(this); QList<QAudioDeviceInfo> devices = QAudioDeviceInfo::availableDevices(QAudio::AudioInput); for(int i = 0; i < devices.size(); ++i) - deviceBox->addItem(devices.at(i).deviceName(), qVariantFromValue(devices.at(i))); + m_deviceBox->addItem(devices.at(i).deviceName(), qVariantFromValue(devices.at(i))); - connect(deviceBox, SIGNAL(activated(int)), SLOT(deviceChanged(int))); - layout->addWidget(deviceBox); + connect(m_deviceBox, SIGNAL(activated(int)), SLOT(deviceChanged(int))); + layout->addWidget(m_deviceBox); - button = new QPushButton(this); - button->setText(tr("Click for Push Mode")); - connect(button, SIGNAL(clicked()), SLOT(toggleMode())); - layout->addWidget(button); + m_modeButton = new QPushButton(this); + m_modeButton->setText(PushModeLabel); + connect(m_modeButton, SIGNAL(clicked()), SLOT(toggleMode())); + layout->addWidget(m_modeButton); - button2 = new QPushButton(this); - button2->setText(tr("Click To Suspend")); - connect(button2, SIGNAL(clicked()), SLOT(toggleSuspend())); - layout->addWidget(button2); + m_suspendResumeButton = new QPushButton(this); + m_suspendResumeButton->setText(SuspendLabel); + connect(m_suspendResumeButton, SIGNAL(clicked()), SLOT(toggleSuspend())); + layout->addWidget(m_suspendResumeButton); - window->setLayout(layout); - setCentralWidget(window); - window->show(); + window->setLayout(layout.data()); + layout.take(); // ownership transferred - buffer = new char[BUFFER_SIZE]; + setCentralWidget(window.data()); + QWidget *const windowPtr = window.take(); // ownership transferred + windowPtr->show(); +} - pullMode = true; +void InputTest::initializeAudio() +{ + m_pullMode = true; - format.setFrequency(8000); - format.setChannels(1); - format.setSampleSize(16); - format.setSampleType(QAudioFormat::SignedInt); - format.setByteOrder(QAudioFormat::LittleEndian); - format.setCodec("audio/pcm"); + m_format.setFrequency(8000); + m_format.setChannels(1); + m_format.setSampleSize(16); + m_format.setSampleType(QAudioFormat::SignedInt); + m_format.setByteOrder(QAudioFormat::LittleEndian); + m_format.setCodec("audio/pcm"); QAudioDeviceInfo info(QAudioDeviceInfo::defaultInputDevice()); - if (!info.isFormatSupported(format)) { - qWarning()<<"default format not supported try to use nearest"; - format = info.nearestFormat(format); + if (!info.isFormatSupported(m_format)) { + qWarning() << "Default format not supported - trying to use nearest"; + m_format = info.nearestFormat(m_format); } - if(format.sampleSize() != 16) { - qWarning()<<"audio device doesn't support 16 bit samples, example cannot run"; - audioInput = 0; - button->setDisabled(true); - button2->setDisabled(true); - return; - } + m_audioInfo = new AudioInfo(m_format, this); + connect(m_audioInfo, SIGNAL(update()), SLOT(refreshDisplay())); - audioInput = new QAudioInput(format,this); - connect(audioInput, SIGNAL(notify()), SLOT(status())); - connect(audioInput, SIGNAL(stateChanged(QAudio::State)), SLOT(state(QAudio::State))); - audioinfo = new AudioInfo(this,audioInput); - connect(audioinfo, SIGNAL(update()), SLOT(refreshDisplay())); - audioinfo->start(); - audioInput->start(audioinfo); + createAudioInput(); } -InputTest::~InputTest() {} +void InputTest::createAudioInput() +{ + m_audioInput = new QAudioInput(m_device, m_format, this); + connect(m_audioInput, SIGNAL(notify()), SLOT(notified())); + connect(m_audioInput, SIGNAL(stateChanged(QAudio::State)), SLOT(stateChanged(QAudio::State))); + m_audioInfo->start(); + m_audioInput->start(m_audioInfo); +} -void InputTest::status() +void InputTest::notified() { - qWarning()<<"bytesReady = "<<audioInput->bytesReady()<<" bytes, elapsedUSecs = "<<audioInput->elapsedUSecs()<<", processedUSecs = "<<audioInput->processedUSecs(); + qWarning() << "bytesReady = " << m_audioInput->bytesReady() + << ", " << "elapsedUSecs = " <<m_audioInput->elapsedUSecs() + << ", " << "processedUSecs = "<<m_audioInput->processedUSecs(); } void InputTest::readMore() { - if(!audioInput) + if(!m_audioInput) return; - qint64 len = audioInput->bytesReady(); + qint64 len = m_audioInput->bytesReady(); if(len > 4096) len = 4096; - qint64 l = input->read(buffer,len); + qint64 l = m_input->read(m_buffer.data(), len); if(l > 0) { - audioinfo->write(buffer,l); + m_audioInfo->write(m_buffer.constData(), l); } } void InputTest::toggleMode() { // Change bewteen pull and push modes - audioInput->stop(); + m_audioInput->stop(); - if (pullMode) { - button->setText(tr("Click for Pull Mode")); - input = audioInput->start(); - connect(input, SIGNAL(readyRead()), SLOT(readMore())); - pullMode = false; + if (m_pullMode) { + m_modeButton->setText(PullModeLabel); + m_input = m_audioInput->start(); + connect(m_input, SIGNAL(readyRead()), SLOT(readMore())); + m_pullMode = false; } else { - button->setText(tr("Click for Push Mode")); - pullMode = true; - audioInput->start(audioinfo); + m_modeButton->setText(PushModeLabel); + m_pullMode = true; + m_audioInput->start(m_audioInfo); } + + m_suspendResumeButton->setText(SuspendLabel); } void InputTest::toggleSuspend() { // toggle suspend/resume - if(audioInput->state() == QAudio::SuspendedState) { + if(m_audioInput->state() == QAudio::SuspendedState) { qWarning() << "status: Suspended, resume()"; - audioInput->resume(); - button2->setText("Click To Suspend"); - } else if (audioInput->state() == QAudio::ActiveState) { + m_audioInput->resume(); + m_suspendResumeButton->setText(SuspendLabel); + } else if (m_audioInput->state() == QAudio::ActiveState) { qWarning() << "status: Active, suspend()"; - audioInput->suspend(); - button2->setText("Click To Resume"); - } else if (audioInput->state() == QAudio::StoppedState) { + m_audioInput->suspend(); + m_suspendResumeButton->setText(ResumeLabel); + } else if (m_audioInput->state() == QAudio::StoppedState) { qWarning() << "status: Stopped, resume()"; - audioInput->resume(); - button2->setText("Click To Suspend"); - } else if (audioInput->state() == QAudio::IdleState) { + m_audioInput->resume(); + m_suspendResumeButton->setText(SuspendLabel); + } else if (m_audioInput->state() == QAudio::IdleState) { qWarning() << "status: IdleState"; } } -void InputTest::state(QAudio::State state) +void InputTest::stateChanged(QAudio::State state) { - qWarning() << " state=" << state; + qWarning() << "state = " << state; } void InputTest::refreshDisplay() { - canvas->setLevel(audioinfo->LinearMax()); - canvas->repaint(); + m_canvas->setLevel(m_audioInfo->level()); + m_canvas->repaint(); } -void InputTest::deviceChanged(int idx) +void InputTest::deviceChanged(int index) { - audioinfo->stop(); - audioInput->stop(); - audioInput->disconnect(this); - delete audioInput; - - device = deviceBox->itemData(idx).value<QAudioDeviceInfo>(); - audioInput = new QAudioInput(device, format, this); - connect(audioInput, SIGNAL(notify()), SLOT(status())); - connect(audioInput, SIGNAL(stateChanged(QAudio::State)), SLOT(state(QAudio::State))); - audioinfo->start(); - audioInput->start(audioinfo); + m_audioInfo->stop(); + m_audioInput->stop(); + m_audioInput->disconnect(this); + delete m_audioInput; + + m_device = m_deviceBox->itemData(index).value<QAudioDeviceInfo>(); + createAudioInput(); } diff --git a/examples/multimedia/audioinput/audioinput.h b/examples/multimedia/audioinput/audioinput.h index abe2be1..f87c682 100644 --- a/examples/multimedia/audioinput/audioinput.h +++ b/examples/multimedia/audioinput/audioinput.h @@ -45,6 +45,7 @@ #include <QMainWindow> #include <QPushButton> #include <QComboBox> +#include <QByteArray> #include <qaudioinput.h> @@ -52,21 +53,21 @@ class AudioInfo : public QIODevice { Q_OBJECT public: - AudioInfo(QObject *parent, QAudioInput *device); + AudioInfo(const QAudioFormat &format, QObject *parent); ~AudioInfo(); void start(); void stop(); - int LinearMax(); + qreal level() const { return m_level; } qint64 readData(char *data, qint64 maxlen); qint64 writeData(const char *data, qint64 len); - QAudioInput *input; - private: - int m_maxValue; + const QAudioFormat m_format; + quint16 m_maxAmplitude; + qreal m_level; // 0.0 <= m_level <= 1.0 signals: void update(); @@ -80,14 +81,14 @@ class RenderArea : public QWidget public: RenderArea(QWidget *parent = 0); - void setLevel(int value); + void setLevel(qreal value); protected: void paintEvent(QPaintEvent *event); private: - int level; - QPixmap pixmap; + qreal m_level; + QPixmap m_pixmap; }; class InputTest : public QMainWindow @@ -97,29 +98,38 @@ public: InputTest(); ~InputTest(); +private: + void initializeWindow(); + void initializeAudio(); + void createAudioInput(); + private slots: void refreshDisplay(); - void status(); + void notified(); void readMore(); void toggleMode(); void toggleSuspend(); - void state(QAudio::State s); - void deviceChanged(int idx); + void stateChanged(QAudio::State state); + void deviceChanged(int index); private: - AudioInfo *audioinfo; - QAudioDeviceInfo device; - QAudioFormat format; - QAudioInput *audioInput; - QIODevice *input; - RenderArea *canvas; - - bool pullMode; - - QPushButton *button; - QPushButton *button2; - QComboBox *deviceBox; - - char *buffer; + // Owned by layout + RenderArea *m_canvas; + QPushButton *m_modeButton; + QPushButton *m_suspendResumeButton; + QComboBox *m_deviceBox; + + AudioInfo *m_audioInfo; + QAudioDeviceInfo m_device; + QAudioFormat m_format; + QAudioInput *m_audioInput; + QIODevice *m_input; + bool m_pullMode; + QByteArray m_buffer; + + static const QString PushModeLabel; + static const QString PullModeLabel; + static const QString SuspendLabel; + static const QString ResumeLabel; }; diff --git a/examples/multimedia/audiooutput/audiooutput.cpp b/examples/multimedia/audiooutput/audiooutput.cpp index b44accd..cbadf02 100644 --- a/examples/multimedia/audiooutput/audiooutput.cpp +++ b/examples/multimedia/audiooutput/audiooutput.cpp @@ -44,30 +44,34 @@ #include <QAudioOutput> #include <QAudioDeviceInfo> +#include <QtCore/qmath.h> +#include <QtCore/qendian.h> #include "audiooutput.h" -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif +const QString AudioTest::PushModeLabel(tr("Enable push mode")); +const QString AudioTest::PullModeLabel(tr("Enable pull mode")); +const QString AudioTest::SuspendLabel(tr("Suspend playback")); +const QString AudioTest::ResumeLabel(tr("Resume playback")); -#define SECONDS 1 -#define FREQ 600 -#define SYSTEM_FREQ 44100 +const int DurationSeconds = 1; +const int ToneFrequencyHz = 600; +const int DataFrequencyHz = 44100; +const int BufferSize = 32768; -Generator::Generator(QObject *parent) - :QIODevice( parent ) + +Generator::Generator(const QAudioFormat &format, + qint64 durationUs, + int frequency, + QObject *parent) + : QIODevice(parent) + , m_pos(0) { - finished = false; - buffer = new char[SECONDS*SYSTEM_FREQ*4+1000]; - t=buffer; - len=fillData(t,FREQ,SECONDS); /* mono FREQHz sine */ - pos = 0; - total = len; + generateData(format, durationUs, frequency); } Generator::~Generator() { - delete [] buffer; + } void Generator::start() @@ -77,47 +81,65 @@ void Generator::start() void Generator::stop() { + m_pos = 0; close(); } -int Generator::putShort(char *t, unsigned int value) +void Generator::generateData(const QAudioFormat &format, qint64 durationUs, int frequency) { - *(unsigned char *)(t++)=value&255; - *(unsigned char *)(t)=(value/256)&255; - return 2; -} - -int Generator::fillData(char *start, int frequency, int seconds) -{ - int i, len=0; - int value; - for(i=0; i<seconds*SYSTEM_FREQ; i++) { - value=(int)(32767.0*sin(2.0*M_PI*((double)(i))*(double)(frequency)/SYSTEM_FREQ)); - putShort(start, value); - start += 4; - len+=2; + const int channelBytes = format.sampleSize() / 8; + const int sampleBytes = format.channels() * channelBytes; + + qint64 length = (format.frequency() * format.channels() * (format.sampleSize() / 8)) + * durationUs / 100000; + + Q_ASSERT(length % sampleBytes == 0); + Q_UNUSED(sampleBytes) // suppress warning in release builds + + m_buffer.resize(length); + unsigned char *ptr = reinterpret_cast<unsigned char *>(m_buffer.data()); + int sampleIndex = 0; + + while (length) { + const qreal x = qSin(2 * M_PI * frequency * qreal(sampleIndex % format.frequency()) / format.frequency()); + for (int i=0; i<format.channels(); ++i) { + if (format.sampleSize() == 8 && format.sampleType() == QAudioFormat::UnSignedInt) { + const quint8 value = static_cast<quint8>((1.0 + x) / 2 * 255); + *reinterpret_cast<quint8*>(ptr) = value; + } else if (format.sampleSize() == 8 && format.sampleType() == QAudioFormat::SignedInt) { + const qint8 value = static_cast<qint8>(x * 127); + *reinterpret_cast<quint8*>(ptr) = value; + } else if (format.sampleSize() == 16 && format.sampleType() == QAudioFormat::UnSignedInt) { + quint16 value = static_cast<quint16>((1.0 + x) / 2 * 65535); + if (format.byteOrder() == QAudioFormat::LittleEndian) + qToLittleEndian<quint16>(value, ptr); + else + qToBigEndian<quint16>(value, ptr); + } else if (format.sampleSize() == 16 && format.sampleType() == QAudioFormat::SignedInt) { + qint16 value = static_cast<qint16>(x * 32767); + if (format.byteOrder() == QAudioFormat::LittleEndian) + qToLittleEndian<qint16>(value, ptr); + else + qToBigEndian<qint16>(value, ptr); + } + + ptr += channelBytes; + length -= channelBytes; + } + ++sampleIndex; } - return len; } -qint64 Generator::readData(char *data, qint64 maxlen) +qint64 Generator::readData(char *data, qint64 len) { - int len = maxlen; - if (len > 16384) - len = 16384; - - if (len < (SECONDS*SYSTEM_FREQ*2)-pos) { - // Normal - memcpy(data,t+pos,len); - pos+=len; - return len; - } else { - // Whats left and reset to start - qint64 left = (SECONDS*SYSTEM_FREQ*2)-pos; - memcpy(data,t+pos,left); - pos=0; - return left; + qint64 total = 0; + while (len - total) { + const qint64 chunk = qMin((m_buffer.size() - m_pos), len - total); + memcpy(data, m_buffer.constData() + m_pos, chunk); + m_pos = (m_pos + chunk) % m_buffer.size(); + total += chunk; } + return total; } qint64 Generator::writeData(const char *data, qint64 len) @@ -128,158 +150,166 @@ qint64 Generator::writeData(const char *data, qint64 len) return 0; } -AudioTest::AudioTest() +qint64 Generator::bytesAvailable() const { - QWidget *window = new QWidget; - QVBoxLayout* layout = new QVBoxLayout; - - deviceBox = new QComboBox(this); - foreach (const QAudioDeviceInfo &deviceInfo, QAudioDeviceInfo::availableDevices(QAudio::AudioOutput)) - deviceBox->addItem(deviceInfo.deviceName(), qVariantFromValue(deviceInfo)); - connect(deviceBox,SIGNAL(activated(int)),SLOT(deviceChanged(int))); - layout->addWidget(deviceBox); - - button = new QPushButton(this); - button->setText(tr("Click for Push Mode")); - connect(button,SIGNAL(clicked()),SLOT(toggle())); - layout->addWidget(button); - - button2 = new QPushButton(this); - button2->setText(tr("Click To Suspend")); - connect(button2,SIGNAL(clicked()),SLOT(togglePlay())); - layout->addWidget(button2); - - window->setLayout(layout); - setCentralWidget(window); - window->show(); + return m_buffer.size() + QIODevice::bytesAvailable(); +} - buffer = new char[BUFFER_SIZE]; +AudioTest::AudioTest() + : m_pullTimer(new QTimer(this)) + , m_modeButton(0) + , m_suspendResumeButton(0) + , m_deviceBox(0) + , m_device(QAudioDeviceInfo::defaultOutputDevice()) + , m_generator(0) + , m_audioOutput(0) + , m_output(0) + , m_buffer(BufferSize, 0) +{ + initializeWindow(); + initializeAudio(); +} - gen = new Generator(this); +void AudioTest::initializeWindow() +{ + QScopedPointer<QWidget> window(new QWidget); + QScopedPointer<QVBoxLayout> layout(new QVBoxLayout); - pullMode = true; + m_deviceBox = new QComboBox(this); + foreach (const QAudioDeviceInfo &deviceInfo, QAudioDeviceInfo::availableDevices(QAudio::AudioOutput)) + m_deviceBox->addItem(deviceInfo.deviceName(), qVariantFromValue(deviceInfo)); + connect(m_deviceBox,SIGNAL(activated(int)),SLOT(deviceChanged(int))); + layout->addWidget(m_deviceBox); + + m_modeButton = new QPushButton(this); + m_modeButton->setText(PushModeLabel); + connect(m_modeButton, SIGNAL(clicked()), SLOT(toggleMode())); + layout->addWidget(m_modeButton); + + m_suspendResumeButton = new QPushButton(this); + m_suspendResumeButton->setText(SuspendLabel); + connect(m_suspendResumeButton, SIGNAL(clicked()), SLOT(toggleSuspendResume())); + layout->addWidget(m_suspendResumeButton); + + window->setLayout(layout.data()); + layout.take(); // ownership transferred + + setCentralWidget(window.data()); + QWidget *const windowPtr = window.take(); // ownership transferred + windowPtr->show(); +} - timer = new QTimer(this); - connect(timer,SIGNAL(timeout()),SLOT(writeMore())); +void AudioTest::initializeAudio() +{ + connect(m_pullTimer, SIGNAL(timeout()), SLOT(pullTimerExpired())); - gen->start(); + m_pullMode = true; - settings.setFrequency(SYSTEM_FREQ); - settings.setChannels(1); - settings.setSampleSize(16); - settings.setCodec("audio/pcm"); - settings.setByteOrder(QAudioFormat::LittleEndian); - settings.setSampleType(QAudioFormat::SignedInt); + m_format.setFrequency(DataFrequencyHz); + m_format.setChannels(1); + m_format.setSampleSize(16); + m_format.setCodec("audio/pcm"); + m_format.setByteOrder(QAudioFormat::LittleEndian); + m_format.setSampleType(QAudioFormat::SignedInt); QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice()); - if (!info.isFormatSupported(settings)) { - qWarning()<<"default format not supported try to use nearest"; - settings = info.nearestFormat(settings); + if (!info.isFormatSupported(m_format)) { + qWarning() << "Default format not supported - trying to use nearest"; + m_format = info.nearestFormat(m_format); } - if(settings.sampleSize() != 16) { - qWarning()<<"audio device doesn't support 16 bit samples, example cannot run"; - button->setDisabled(true); - button2->setDisabled(true); - audioOutput = 0; - return; - } + m_generator = new Generator(m_format, DurationSeconds*1000000, ToneFrequencyHz, this); - audioOutput = new QAudioOutput(settings,this); - connect(audioOutput,SIGNAL(notify()),SLOT(status())); - connect(audioOutput,SIGNAL(stateChanged(QAudio::State)),SLOT(state(QAudio::State))); + createAudioOutput(); +} - audioOutput->start(gen); +void AudioTest::createAudioOutput() +{ + delete m_audioOutput; + m_audioOutput = 0; + m_audioOutput = new QAudioOutput(m_device, m_format, this); + connect(m_audioOutput, SIGNAL(notify()), SLOT(notified())); + connect(m_audioOutput, SIGNAL(stateChanged(QAudio::State)), SLOT(stateChanged(QAudio::State))); + m_generator->start(); + m_audioOutput->start(m_generator); } AudioTest::~AudioTest() { - delete [] buffer; + } -void AudioTest::deviceChanged(int idx) +void AudioTest::deviceChanged(int index) { - timer->stop(); - gen->stop(); - audioOutput->stop(); - audioOutput->disconnect(this); - delete audioOutput; - - device = deviceBox->itemData(idx).value<QAudioDeviceInfo>(); - audioOutput = new QAudioOutput(device,settings,this); - connect(audioOutput,SIGNAL(notify()),SLOT(status())); - connect(audioOutput,SIGNAL(stateChanged(QAudio::State)),SLOT(state(QAudio::State))); - gen->start(); - audioOutput->start(gen); + m_pullTimer->stop(); + m_generator->stop(); + m_audioOutput->stop(); + m_audioOutput->disconnect(this); + m_device = m_deviceBox->itemData(index).value<QAudioDeviceInfo>(); + createAudioOutput(); } -void AudioTest::status() +void AudioTest::notified() { - qWarning() << "byteFree = " << audioOutput->bytesFree() << " bytes, elapsedUSecs = " << audioOutput->elapsedUSecs() << ", processedUSecs = " << audioOutput->processedUSecs(); + qWarning() << "bytesFree = " << m_audioOutput->bytesFree() + << ", " << "elapsedUSecs = " << m_audioOutput->elapsedUSecs() + << ", " << "processedUSecs = " << m_audioOutput->processedUSecs(); } -void AudioTest::writeMore() +void AudioTest::pullTimerExpired() { - if (!audioOutput) - return; - - if (audioOutput->state() == QAudio::StoppedState) - return; - - int l; - int out; - - int chunks = audioOutput->bytesFree()/audioOutput->periodSize(); - while(chunks) { - l = gen->read(buffer,audioOutput->periodSize()); - if (l > 0) - out = output->write(buffer,l); - if (l != audioOutput->periodSize()) - break; - chunks--; + if (m_audioOutput && m_audioOutput->state() != QAudio::StoppedState) { + int chunks = m_audioOutput->bytesFree()/m_audioOutput->periodSize(); + while (chunks) { + const qint64 len = m_generator->read(m_buffer.data(), m_audioOutput->periodSize()); + if (len) + m_output->write(m_buffer.data(), len); + if (len != m_audioOutput->periodSize()) + break; + --chunks; + } } } -void AudioTest::toggle() +void AudioTest::toggleMode() { - // Change between pull and push modes - - timer->stop(); - audioOutput->stop(); - - if (pullMode) { - button->setText("Click for Pull Mode"); - output = audioOutput->start(); - pullMode = false; - timer->start(20); + m_pullTimer->stop(); + m_audioOutput->stop(); + + if (m_pullMode) { + m_modeButton->setText(PullModeLabel); + m_output = m_audioOutput->start(); + m_pullMode = false; + m_pullTimer->start(20); } else { - button->setText("Click for Push Mode"); - pullMode = true; - audioOutput->start(gen); + m_modeButton->setText(PushModeLabel); + m_pullMode = true; + m_audioOutput->start(m_generator); } + + m_suspendResumeButton->setText(SuspendLabel); } -void AudioTest::togglePlay() +void AudioTest::toggleSuspendResume() { - // toggle suspend/resume - if (audioOutput->state() == QAudio::SuspendedState) { + if (m_audioOutput->state() == QAudio::SuspendedState) { qWarning() << "status: Suspended, resume()"; - audioOutput->resume(); - button2->setText("Click To Suspend"); - } else if (audioOutput->state() == QAudio::ActiveState) { + m_audioOutput->resume(); + m_suspendResumeButton->setText(SuspendLabel); + } else if (m_audioOutput->state() == QAudio::ActiveState) { qWarning() << "status: Active, suspend()"; - audioOutput->suspend(); - button2->setText("Click To Resume"); - } else if (audioOutput->state() == QAudio::StoppedState) { + m_audioOutput->suspend(); + m_suspendResumeButton->setText(ResumeLabel); + } else if (m_audioOutput->state() == QAudio::StoppedState) { qWarning() << "status: Stopped, resume()"; - audioOutput->resume(); - button2->setText("Click To Suspend"); - } else if (audioOutput->state() == QAudio::IdleState) { + m_audioOutput->resume(); + m_suspendResumeButton->setText(SuspendLabel); + } else if (m_audioOutput->state() == QAudio::IdleState) { qWarning() << "status: IdleState"; } } -void AudioTest::state(QAudio::State state) +void AudioTest::stateChanged(QAudio::State state) { - qWarning() << " state=" << state; + qWarning() << "state = " << state; } diff --git a/examples/multimedia/audiooutput/audiooutput.h b/examples/multimedia/audiooutput/audiooutput.h index 372cf78..889482b 100644 --- a/examples/multimedia/audiooutput/audiooutput.h +++ b/examples/multimedia/audiooutput/audiooutput.h @@ -41,14 +41,13 @@ #include <math.h> -#define BUFFER_SIZE 32768 - #include <QObject> #include <QMainWindow> #include <QIODevice> #include <QTimer> #include <QPushButton> #include <QComboBox> +#include <QByteArray> #include <QAudioOutput> @@ -56,26 +55,22 @@ class Generator : public QIODevice { Q_OBJECT public: - Generator(QObject *parent); + Generator(const QAudioFormat &format, qint64 durationUs, int frequency, QObject *parent); ~Generator(); void start(); void stop(); - char *t; - int len; - int pos; - int total; - char *buffer; - bool finished; - int chunk_size; - qint64 readData(char *data, qint64 maxlen); qint64 writeData(const char *data, qint64 len); + qint64 bytesAvailable() const; private: - int putShort(char *t, unsigned int value); - int fillData(char *start, int frequency, int seconds); + void generateData(const QAudioFormat &format, qint64 durationUs, int frequency); + +private: + qint64 m_pos; + QByteArray m_buffer; }; class AudioTest : public QMainWindow @@ -85,26 +80,39 @@ public: AudioTest(); ~AudioTest(); - QAudioDeviceInfo device; - Generator* gen; - QAudioOutput* audioOutput; - QIODevice* output; - QTimer* timer; - QAudioFormat settings; +private: + void initializeWindow(); + void initializeAudio(); + void createAudioOutput(); + +private: + QTimer* m_pullTimer; + + // Owned by layout + QPushButton* m_modeButton; + QPushButton* m_suspendResumeButton; + QComboBox* m_deviceBox; + + QAudioDeviceInfo m_device; + Generator* m_generator; + QAudioOutput* m_audioOutput; + QIODevice* m_output; // not owned + QAudioFormat m_format; - bool pullMode; - char* buffer; + bool m_pullMode; + QByteArray m_buffer; - QPushButton* button; - QPushButton* button2; - QComboBox* deviceBox; + static const QString PushModeLabel; + static const QString PullModeLabel; + static const QString SuspendLabel; + static const QString ResumeLabel; private slots: - void status(); - void writeMore(); - void toggle(); - void togglePlay(); - void state(QAudio::State s); - void deviceChanged(int idx); + void notified(); + void pullTimerExpired(); + void toggleMode(); + void toggleSuspendResume(); + void stateChanged(QAudio::State state); + void deviceChanged(int index); }; diff --git a/header.BSD b/header.BSD new file mode 100644 index 0000000..3c0d604 --- /dev/null +++ b/header.BSD @@ -0,0 +1,40 @@ +/**************************************************************************** +** +** 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 FOO module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + diff --git a/header.LGPL b/header.LGPL new file mode 100644 index 0000000..4fbd874 --- /dev/null +++ b/header.LGPL @@ -0,0 +1,41 @@ +/**************************************************************************** +** +** 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 FOO module 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$ +** +****************************************************************************/ + diff --git a/header.LGPL-ONLY b/header.LGPL-ONLY new file mode 100644 index 0000000..59b4c04 --- /dev/null +++ b/header.LGPL-ONLY @@ -0,0 +1,22 @@ +/**************************************************************************** +** +** 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 FOO module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL-ONLY$ +** GNU Lesser General Public License Usage +** 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. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ diff --git a/mkspecs/common/symbian/symbian.conf b/mkspecs/common/symbian/symbian.conf index aab766d..d2edbdb 100644 --- a/mkspecs/common/symbian/symbian.conf +++ b/mkspecs/common/symbian/symbian.conf @@ -75,24 +75,24 @@ QMAKE_LIBS_COMPAT = QMAKE_LIBS_QT_ENTRY = -llibcrt0.lib QMAKE_LIBS_S60 = -lavkon -!contains(QMAKE_HOST.os, "Windows")|!isEmpty(QMAKE_SH) { - QMAKE_COPY = cp - QMAKE_COPY_DIR = cp -r - QMAKE_MOVE = mv - QMAKE_DEL_FILE = rm -f - QMAKE_MKDIR = mkdir - QMAKE_DEL_DIR = rmdir - QMAKE_DEL_TREE = rmdir /s /q - QMAKE_CHK_DIR_EXISTS = test -d -} else { +contains(QMAKE_HOST.os,Windows) { QMAKE_COPY = copy /y QMAKE_COPY_DIR = xcopy /s /q /y /i QMAKE_MOVE = move QMAKE_DEL_FILE = del 2> NUL QMAKE_MKDIR = mkdir QMAKE_DEL_DIR = rmdir - QMAKE_DEL_TREE = rm -rf + QMAKE_DEL_TREE = rmdir /s /q QMAKE_CHK_DIR_EXISTS = if not exist +} else { + QMAKE_COPY = cp + QMAKE_COPY_DIR = cp -r + QMAKE_MOVE = mv + QMAKE_DEL_FILE = rm -f + QMAKE_MKDIR = mkdir + QMAKE_DEL_DIR = rmdir + QMAKE_DEL_TREE = rm -rf + QMAKE_CHK_DIR_EXISTS = test -d } contains(QMAKE_HOST.os, "Windows") { diff --git a/mkspecs/features/symbian/stl.prf b/mkspecs/features/symbian/stl.prf index e21ee5c..85c758a 100644 --- a/mkspecs/features/symbian/stl.prf +++ b/mkspecs/features/symbian/stl.prf @@ -15,11 +15,18 @@ INCLUDEPATH += $$OS_LAYER_STDCPP_SYSTEMINCLUDE INCLUDEPATH -= $$[QT_INSTALL_PREFIX]/mkspecs/common/symbian/stl-off # libstdcppv5 is preferred over libstdcpp as it has/uses the throwing version of operator new -exists($${EPOCROOT}epoc32/release/armv5/urel/libstdcppv5.dll)|exists($${EPOCROOT}epoc32/release/winscw/udeb/libstdcppv5.dll) { - LIBS *= -llibstdcppv5.dll +STL_LIB = -llibstdcppv5.dll - # STDCPP turns on standard C++ new behaviour (ie. throwing new) - MMP_RULES += "STDCPP" -} else { - LIBS *= -llibstdcpp.dll +# STDCPP turns on standard C++ new behaviour (ie. throwing new) +STL_MMP_RULE = "STDCPP" + +# Fall back to old implementation if that is the only one that is found +exists($${EPOCROOT}epoc32/release/armv5/urel/libstdcpp.dll)|exists($${EPOCROOT}epoc32/release/winscw/udeb/libstdcpp.dll) { + !exists($${EPOCROOT}epoc32/release/armv5/urel/libstdcppv5.dll):!exists($${EPOCROOT}epoc32/release/winscw/udeb/libstdcppv5.dll) { + STL_LIB = -llibstdcpp.dll + STL_MMP_RULE = + } } + +LIBS *= $$STL_LIB +MMP_RULES *= $$STL_MMP_RULE diff --git a/qmake/Makefile.unix b/qmake/Makefile.unix index 5e3190d..54d52f2 100644 --- a/qmake/Makefile.unix +++ b/qmake/Makefile.unix @@ -10,7 +10,9 @@ OBJS=project.o property.o main.o makefile.o unixmake2.o unixmake.o \ mingw_make.o option.o winmakefile.o projectgenerator.o \ meta.o makefiledeps.o metamakefile.o xmloutput.o pbuilder_pbx.o \ borland_bmake.o msvc_vcproj.o msvc_nmake.o msvc_objectmodel.o \ - symmake.o initprojectdeploy_symbian.o symmake_abld.o symmake_sbsv2.o + symmake.o initprojectdeploy_symbian.o symmake_abld.o symmake_sbsv2.o \ + registry.o \ + epocroot.o #qt code QOBJS=qtextcodec.o qutfcodec.o qstring.o qtextstream.o qiodevice.o qmalloc.o qglobal.o \ @@ -32,6 +34,8 @@ DEPEND_SRC=project.cpp property.cpp meta.cpp main.cpp generators/makefile.cpp ge generators/makefiledeps.cpp option.cpp generators/win32/mingw_make.cpp generators/makefile.cpp \ generators/win32/msvc_objectmodel.cpp generators/win32/msvc_nmake.cpp generators/win32/borland_bmake.cpp \ generators/symbian/symmake.cpp generators/symbian/initprojectdeploy_symbian.cpp \ + $(SOURCE_PATH)/tools/shared/windows/registry.cpp \ + $(SOURCE_PATH)/tools/shared/symbian/epocroot.cpp \ generators/symbian/symmake_abld.cpp generators/symbian/symmake_sbsv2.cpp \ $(SOURCE_PATH)/src/corelib/codecs/qtextcodec.cpp $(SOURCE_PATH)/src/corelib/codecs/qutfcodec.cpp \ $(SOURCE_PATH)/src/corelib/tools/qstring.cpp $(SOURCE_PATH)/src/corelib/io/qfile.cpp \ @@ -62,6 +66,7 @@ DEPEND_SRC=project.cpp property.cpp meta.cpp main.cpp generators/makefile.cpp ge CPPFLAGS = -I. -Igenerators -Igenerators/unix -Igenerators/win32 -Igenerators/mac -Igenerators/symbian \ -I$(BUILD_PATH)/include -I$(BUILD_PATH)/include/QtCore \ -I$(BUILD_PATH)/src/corelib/global -I$(BUILD_PATH)/src/corelib/xml \ + -I$(BUILD_PATH)/tools/shared \ -DQT_NO_PCRE \ -DQT_BUILD_QMAKE -DQT_BOOTSTRAPPED \ -DQT_NO_TEXTCODEC -DQT_NO_UNICODETABLES -DQT_NO_COMPONENT -DQT_NO_STL \ @@ -278,6 +283,12 @@ symmake_sbsv2.o: generators/symbian/symmake_sbsv2.cpp initprojectdeploy_symbian.o: generators/symbian/initprojectdeploy_symbian.cpp $(CXX) -c -o $@ $(CXXFLAGS) generators/symbian/initprojectdeploy_symbian.cpp +registry.o: $(SOURCE_PATH)/tools/shared/windows/registry.cpp + $(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/tools/shared/windows/registry.cpp + +epocroot.o: $(SOURCE_PATH)/tools/shared/symbian/epocroot.cpp + $(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/tools/shared/symbian/epocroot.cpp + projectgenerator.o: generators/projectgenerator.cpp $(CXX) -c -o $@ $(CXXFLAGS) generators/projectgenerator.cpp @@ -286,6 +297,7 @@ qxmlstream.o: $(SOURCE_PATH)/src/corelib/xml/qxmlstream.cpp qxmlutils.o: $(SOURCE_PATH)/src/corelib/xml/qxmlutils.cpp $(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/xml/qxmlutils.cpp + #default rules .cpp.o: $(CXX) -c -o $@ $(CXXFLAGS) $< diff --git a/qmake/Makefile.win32 b/qmake/Makefile.win32 index 1f3092a..a598350 100644 --- a/qmake/Makefile.win32 +++ b/qmake/Makefile.win32 @@ -34,6 +34,7 @@ CFLAGS = -c -Fo$@ \ -I$(BUILD_PATH)\src\corelib\global \ -I$(BUILD_PATH)\src\corelib\xml \ -I$(SOURCE_PATH)\mkspecs\$(QMAKESPEC) \ + -I$(SOURCE_PATH)\tools\shared \ -DQT_NO_TEXTCODEC -DQT_NO_UNICODETABLES -DQT_LITE_COMPONENT -DQT_NODLL -DQT_NO_STL \ -DQT_NO_COMPRESS -DUNICODE -DHAVE_QCONFIG_CPP -DQT_BUILD_QMAKE -DQT_NO_THREAD \ -DQT_NO_QOBJECT -DQT_NO_GEOM_VARIANT -DQT_NO_DATASTREAM -DQT_NO_PCRE -DQT_BOOTSTRAPPED \ @@ -59,6 +60,7 @@ CFLAGS = -c -o$@ \ -I$(SOURCE_PATH)\include -I$(SOURCE_PATH)\include\QtCore \ -I$(BUILD_PATH)\src\corelib\global \ -I$(SOURCE_PATH)\mkspecs\$(QMAKESPEC) \ + -I$(SOURCE_PATH)\tools\shared \ -DQT_NO_TEXTCODEC -DQT_NO_UNICODETABLES -DQT_LITE_COMPONENT -DQT_NODLL -DQT_NO_STL \ -DQT_NO_COMPRESS -DUNICODE -DHAVE_QCONFIG_CPP -DQT_BUILD_QMAKE -DQT_NO_THREAD \ -DQT_NO_QOBJECT -DQT_NO_GEOM_VARIANT @@ -75,6 +77,8 @@ OBJS = project.obj main.obj makefile.obj unixmake.obj unixmake2.obj mingw makefiledeps.obj metamakefile.obj xmloutput.obj pbuilder_pbx.obj \ borland_bmake.obj msvc_nmake.obj msvc_vcproj.obj \ msvc_objectmodel.obj symmake.obj initprojectdeploy_symbian.obj \ + registry.obj \ + epocroot.obj \ symmake_abld.obj symmake_sbsv2.obj !IFDEF QMAKE_OPENSOURCE_EDITION @@ -197,6 +201,8 @@ clean:: -del symmake_abld.obj -del symmake_sbsv2.obj -del initprojectdeploy_symbian.obj + -del registry.obj + -del epocroot.obj -del pbuilder_pbx.obj -del qxmlstream.obj -del qxmlutils.obj @@ -393,6 +399,12 @@ symmake_sbsv2.obj: $(SOURCE_PATH)/qmake/generators/symbian/symmake_sbsv2.cpp initprojectdeploy_symbian.obj: $(SOURCE_PATH)/qmake/generators/symbian/initprojectdeploy_symbian.cpp $(CXX) $(CXXFLAGS) generators/symbian/initprojectdeploy_symbian.cpp +registry.obj: $(SOURCE_PATH)/tools/shared/windows/registry.cpp + $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/tools/shared/windows/registry.cpp + +epocroot.obj: $(SOURCE_PATH)/tools/shared/symbian/epocroot.cpp + $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/tools/shared/symbian/epocroot.cpp + md5.obj: $(SOURCE_PATH)\src\3rdparty\md5\md5.cpp $(CXX) $(CXXFLAGS) $(SOURCE_PATH)\src\3rdparty\md5\md5.cpp diff --git a/qmake/Makefile.win32-g++ b/qmake/Makefile.win32-g++ index 41a1d8c..d4d6e0e 100644 --- a/qmake/Makefile.win32-g++ +++ b/qmake/Makefile.win32-g++ @@ -21,6 +21,7 @@ CFLAGS = -c -o$@ -O \ -I$(BUILD_PATH)/src/corelib/global \ -I$(BUILD_PATH)/src/corelib/xml \ -I$(SOURCE_PATH)/mkspecs/win32-g++ \ + -I$(SOURCE_PATH)/tools/shared \ -DQT_NO_TEXTCODEC -DQT_NO_UNICODETABLES -DQT_LITE_COMPONENT -DQT_NO_PCRE \ -DQT_NODLL -DQT_NO_STL -DQT_NO_COMPRESS -DUNICODE -DHAVE_QCONFIG_CPP \ -DQT_BUILD_QMAKE -DQT_NO_THREAD -DQT_NO_QOBJECT -DQT_NO_GEOM_VARIANT -DQT_NO_DATASTREAM \ @@ -38,6 +39,8 @@ OBJS = project.o main.o makefile.o unixmake.o unixmake2.o mingw_make.o \ makefiledeps.o metamakefile.o xmloutput.o pbuilder_pbx.o \ borland_bmake.o msvc_nmake.o msvc_vcproj.o \ msvc_objectmodel.o symmake.o initprojectdeploy_symbian.o \ + registry.o \ + epocroot.o \ symmake_abld.o symmake_sbsv2.o ifdef QMAKE_OPENSOURCE_EDITION @@ -275,6 +278,12 @@ symmake_sbsv2.o: $(SOURCE_PATH)/qmake/generators/symbian/symmake_sbsv2.cpp initprojectdeploy_symbian.o: $(SOURCE_PATH)/qmake/generators/symbian/initprojectdeploy_symbian.cpp $(CXX) $(CXXFLAGS) generators/symbian/initprojectdeploy_symbian.cpp +registry.o: $(SOURCE_PATH)/tools/shared/windows/registry.cpp + $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/tools/shared/windows/registry.cpp + +epocroot.o: $(SOURCE_PATH)/tools/shared/symbian/epocroot.cpp + $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/tools/shared/symbian/epocroot.cpp + project.o: $(SOURCE_PATH)/qmake/project.cpp $(SOURCE_PATH)/qmake/project.h $(SOURCE_PATH)/qmake/option.h $(CXX) $(CXXFLAGS) project.cpp diff --git a/qmake/Makefile.win32-g++-sh b/qmake/Makefile.win32-g++-sh index 0b08320..5061089 100644 --- a/qmake/Makefile.win32-g++-sh +++ b/qmake/Makefile.win32-g++-sh @@ -21,6 +21,7 @@ CFLAGS = -c -o$@ -O \ -I$(BUILD_PATH)/src/corelib/global \ -I$(BUILD_PATH)/src/corelib/xml \ -I$(SOURCE_PATH)/mkspecs/win32-g++ \ + -I$(SOURCE_PATH)/tools/shared \ -DQT_NO_TEXTCODEC -DQT_NO_UNICODETABLES -DQT_LITE_COMPONENT -DQT_NO_PCRE \ -DQT_NODLL -DQT_NO_STL -DQT_NO_COMPRESS -DUNICODE -DHAVE_QCONFIG_CPP \ -DQT_BUILD_QMAKE -DQT_NO_THREAD -DQT_NO_QOBJECT -DQT_NO_GEOM_VARIANT -DQT_NO_DATASTREAM \ @@ -38,6 +39,8 @@ OBJS = project.o main.o makefile.o unixmake.o unixmake2.o mingw_make.o \ makefiledeps.o metamakefile.o xmloutput.o pbuilder_pbx.o \ borland_bmake.o msvc_nmake.o msvc_vcproj.o \ msvc_objectmodel.o symmake.o initprojectdeploy_symbian.o \ + registry.o \ + epocroot.o \ symmake_abld.o symmake_sbsv2.o ifdef QMAKE_OPENSOURCE_EDITION @@ -274,6 +277,12 @@ symmake_sbsv2.o: $(SOURCE_PATH)/qmake/generators/symbian/symmake_sbsv2.cpp initprojectdeploy_symbian.o: $(SOURCE_PATH)/qmake/generators/symbian/initprojectdeploy_symbian.cpp $(CXX) $(CXXFLAGS) generators/symbian/initprojectdeploy_symbian.cpp +registry.o: $(SOURCE_PATH)/tools/shared/windows/registry.cpp + $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/tools/shared/windows/registry.cpp + +epocroot.o: $(SOURCE_PATH)/tools/shared/symbian/epocroot.cpp + $(CXX) $(CXXFLAGS) $(SOURCE_PATH)/tools/shared/symbian/epocroot.cpp + project.o: $(SOURCE_PATH)/qmake/project.cpp $(SOURCE_PATH)/qmake/project.h $(SOURCE_PATH)/qmake/option.h $(CXX) $(CXXFLAGS) project.cpp diff --git a/qmake/generators/symbian/initprojectdeploy_symbian.cpp b/qmake/generators/symbian/initprojectdeploy_symbian.cpp index 7279a4c..0d50112 100644 --- a/qmake/generators/symbian/initprojectdeploy_symbian.cpp +++ b/qmake/generators/symbian/initprojectdeploy_symbian.cpp @@ -46,105 +46,15 @@ #include <qsettings.h> #include <qdebug.h> +// Included from tools/shared +#include <symbian/epocroot.h> + #define SYSBIN_DIR "\\sys\\bin" #define SUFFIX_DLL "dll" #define SUFFIX_EXE "exe" #define SUFFIX_QTPLUGIN "qtplugin" -static void fixEpocRootStr(QString& path) -{ - path.replace("\\", "/"); - - if (path.size() > 1 && path[1] == QChar(':')) { - path = path.mid(2); - } - - if (!path.size() || path[path.size()-1] != QChar('/')) { - path += QChar('/'); - } -} - -#define SYMBIAN_SDKS_KEY "HKEY_LOCAL_MACHINE\\Software\\Symbian\\EPOC SDKs" - -static QString epocRootStr; - -QString epocRoot() -{ - if (!epocRootStr.isEmpty()) { - return epocRootStr; - } - - // First, check the env variable - epocRootStr = qgetenv("EPOCROOT"); - - if (epocRootStr.isEmpty()) { - // No EPOCROOT set, check the default device - // First check EPOCDEVICE env variable - QString defaultDevice = qgetenv("EPOCDEVICE"); - - // Check the windows registry via QSettings for devices.xml path - QSettings settings(SYMBIAN_SDKS_KEY, QSettings::NativeFormat); - QString devicesXmlPath = settings.value("CommonPath").toString(); - - if (!devicesXmlPath.isEmpty()) { - // Parse xml for correct device - devicesXmlPath += "/devices.xml"; - QFile devicesFile(devicesXmlPath); - if (devicesFile.open(QIODevice::ReadOnly)) { - QXmlStreamReader xml(&devicesFile); - while (!xml.atEnd()) { - xml.readNext(); - if (xml.isStartElement() && xml.name() == "devices") { - if (xml.attributes().value("version") == "1.0") { - // Look for correct device - while (!(xml.isEndElement() && xml.name() == "devices") && !xml.atEnd()) { - xml.readNext(); - if (xml.isStartElement() && xml.name() == "device") { - if ((defaultDevice.isEmpty() && xml.attributes().value("default") == "yes") || - (!defaultDevice.isEmpty() && (xml.attributes().value("id").toString() + QString(":") + xml.attributes().value("name").toString()) == defaultDevice)) { - // Found the correct device - while (!(xml.isEndElement() && xml.name() == "device") && !xml.atEnd()) { - xml.readNext(); - if (xml.isStartElement() && xml.name() == "epocroot") { - epocRootStr = xml.readElementText(); - fixEpocRootStr(epocRootStr); - return epocRootStr; - } - } - xml.raiseError("No epocroot element found"); - } - } - } - } else { - xml.raiseError("Invalid 'devices' element version"); - } - } - } - if (xml.hasError()) { - fprintf(stderr, "ERROR: \"%s\" when parsing devices.xml\n", qPrintable(xml.errorString())); - } - } else { - fprintf(stderr, "Could not open devices.xml (%s)\n", qPrintable(devicesXmlPath)); - } - } else { - fprintf(stderr, "Could not retrieve " SYMBIAN_SDKS_KEY " setting\n"); - } - - fprintf(stderr, "Failed to determine epoc root.\n"); - if (!defaultDevice.isEmpty()) - fprintf(stderr, "The device indicated by EPOCDEVICE environment variable (%s) could not be found.\n", qPrintable(defaultDevice)); - fprintf(stderr, "Either set EPOCROOT or EPOCDEVICE environment variable to a valid value, or provide a default Symbian device.\n"); - - // No valid device found; set epocroot to "/" - epocRootStr = QLatin1String("/"); - } - - fixEpocRootStr(epocRootStr); - return epocRootStr; -} - - static bool isPlugin(const QFileInfo& info, const QString& devicePath) { // Libraries are plugins if deployment path is something else than diff --git a/qmake/generators/symbian/initprojectdeploy_symbian.h b/qmake/generators/symbian/initprojectdeploy_symbian.h index e23e6a9..b409225 100644 --- a/qmake/generators/symbian/initprojectdeploy_symbian.h +++ b/qmake/generators/symbian/initprojectdeploy_symbian.h @@ -50,8 +50,6 @@ #include <qfile.h> #include <stdlib.h> -#include "epocroot.h" - #define PLUGIN_STUB_DIR "qmakepluginstubs" struct CopyItem diff --git a/qmake/generators/symbian/symmake.cpp b/qmake/generators/symbian/symmake.cpp index 10cbb8b..e7296a7 100644 --- a/qmake/generators/symbian/symmake.cpp +++ b/qmake/generators/symbian/symmake.cpp @@ -49,6 +49,9 @@ #include <stdlib.h> #include <qdebug.h> +// Included from tools/shared +#include <symbian/epocroot.h> + #ifdef Q_OS_WIN #define SCRIPT_EXT ".bat" #else @@ -1346,7 +1349,7 @@ void SymbianMakefileGenerator::writeBldInfContent(QTextStream &t, bool addDeploy removeSpecialCharacters(bldinfDefine); t << "#ifndef " << bldinfDefine << endl; - t << "\t#include \"" << QDir::toNativeSeparators(bldinfFilename) << "\"" << endl; + t << "\t#include \"" << bldinfFilename << "\"" << endl; t << "#endif // " << bldinfDefine << endl; } diff --git a/qmake/generators/symbian/symmake_abld.cpp b/qmake/generators/symbian/symmake_abld.cpp index 9b7ae3e..81165f5 100644 --- a/qmake/generators/symbian/symmake_abld.cpp +++ b/qmake/generators/symbian/symmake_abld.cpp @@ -48,6 +48,9 @@ #include <qdatetime.h> #include <qdebug.h> +// Included from tools/shared +#include <symbian/epocroot.h> + #define DO_NOTHING_TARGET "do_nothing" #define CREATE_TEMPS_TARGET "create_temps" #define EXTENSION_CLEAN "extension_clean" diff --git a/qmake/generators/symbian/symmake_sbsv2.cpp b/qmake/generators/symbian/symmake_sbsv2.cpp index f610181..4366f0e 100644 --- a/qmake/generators/symbian/symmake_sbsv2.cpp +++ b/qmake/generators/symbian/symmake_sbsv2.cpp @@ -48,6 +48,9 @@ #include <qdatetime.h> #include <qdebug.h> +// Included from tools/shared +#include <symbian/epocroot.h> + SymbianSbsv2MakefileGenerator::SymbianSbsv2MakefileGenerator() : SymbianMakefileGenerator() { } SymbianSbsv2MakefileGenerator::~SymbianSbsv2MakefileGenerator() { } diff --git a/qmake/generators/win32/msvc_vcproj.cpp b/qmake/generators/win32/msvc_vcproj.cpp index 3536a02..f1777e1 100644 --- a/qmake/generators/win32/msvc_vcproj.cpp +++ b/qmake/generators/win32/msvc_vcproj.cpp @@ -67,6 +67,7 @@ QT_END_NAMESPACE #ifdef Q_OS_WIN32 #include <qt_windows.h> +#include <windows/registry.h> QT_BEGIN_NAMESPACE @@ -93,102 +94,6 @@ struct { {NETUnknown, "", ""}, }; -static QString keyPath(const QString &rKey) -{ - int idx = rKey.lastIndexOf(QLatin1Char('\\')); - if (idx == -1) - return QString(); - return rKey.left(idx + 1); -} - -static QString keyName(const QString &rKey) -{ - int idx = rKey.lastIndexOf(QLatin1Char('\\')); - if (idx == -1) - return rKey; - - QString res(rKey.mid(idx + 1)); - if (res == "Default" || res == ".") - res = ""; - return res; -} - -static QString readRegistryKey(HKEY parentHandle, const QString &rSubkey) -{ - - QString rSubkeyName = keyName(rSubkey); - QString rSubkeyPath = keyPath(rSubkey); - - HKEY handle = 0; - LONG res = RegOpenKeyEx(parentHandle, (wchar_t*)rSubkeyPath.utf16(), 0, KEY_READ, &handle); - - if (res != ERROR_SUCCESS) - return QString(); - - // get the size and type of the value - DWORD dataType; - DWORD dataSize; - res = RegQueryValueEx(handle, (wchar_t*)rSubkeyName.utf16(), 0, &dataType, 0, &dataSize); - if (res != ERROR_SUCCESS) { - RegCloseKey(handle); - return QString(); - } - - // get the value - QByteArray data(dataSize, 0); - res = RegQueryValueEx(handle, (wchar_t*)rSubkeyName.utf16(), 0, 0, - reinterpret_cast<unsigned char*>(data.data()), &dataSize); - if (res != ERROR_SUCCESS) { - RegCloseKey(handle); - return QString(); - } - - QString result; - switch (dataType) { - case REG_EXPAND_SZ: - case REG_SZ: { - result = QString::fromWCharArray(((const wchar_t *)data.constData())); - break; - } - - case REG_MULTI_SZ: { - QStringList l; - int i = 0; - for (;;) { - QString s = QString::fromWCharArray((const wchar_t *)data.constData() + i); - i += s.length() + 1; - - if (s.isEmpty()) - break; - l.append(s); - } - result = l.join(", "); - break; - } - - case REG_NONE: - case REG_BINARY: { - result = QString::fromWCharArray((const wchar_t *)data.constData(), data.size() / 2); - break; - } - - case REG_DWORD_BIG_ENDIAN: - case REG_DWORD: { - Q_ASSERT(data.size() == sizeof(int)); - int i; - memcpy((char*)&i, data.constData(), sizeof(int)); - result = QString::number(i); - break; - } - - default: - qWarning("QSettings: unknown data %d type in windows registry", dataType); - break; - } - - RegCloseKey(handle); - return result; -} QT_END_NAMESPACE #endif diff --git a/qmake/project.cpp b/qmake/project.cpp index 8871152..4193163 100644 --- a/qmake/project.cpp +++ b/qmake/project.cpp @@ -44,8 +44,6 @@ #include "option.h" #include "cachekeys.h" -#include "epocroot.h" - #include <qdatetime.h> #include <qfile.h> #include <qfileinfo.h> @@ -64,6 +62,9 @@ #include <stdio.h> #include <stdlib.h> +// Included from tools/shared +#include <symbian/epocroot.h> + #ifdef Q_OS_WIN32 #define QT_POPEN _popen #define QT_PCLOSE _pclose diff --git a/qmake/qmake.pri b/qmake/qmake.pri index 17d9518..0821f00 100644 --- a/qmake/qmake.pri +++ b/qmake/qmake.pri @@ -17,7 +17,9 @@ SOURCES += project.cpp property.cpp main.cpp generators/makefile.cpp \ generators/symbian/symmake.cpp \ generators/symbian/symmake_abld.cpp \ generators/symbian/symmake_sbsv2.cpp \ - generators/symbian/initprojectdeploy_symbian.cpp + generators/symbian/initprojectdeploy_symbian.cpp \ + windows/registry.cpp \ + symbian/epocroot.cpp HEADERS += project.h property.h generators/makefile.h \ generators/unix/unixmake.h meta.h option.h cachekeys.h \ @@ -29,8 +31,9 @@ HEADERS += project.h property.h generators/makefile.h \ generators/symbian/symmake.h \ generators/symbian/symmake_abld.h \ generators/symbian/symmake_sbsv2.h \ - generators/symbian/epocroot.h \ - generators/symbian/initprojectdeploy_symbian.h + generators/symbian/initprojectdeploy_symbian.h \ + windows/registry.h \ + symbian/epocroot.h contains(QT_EDITION, OpenSource) { DEFINES += QMAKE_OPENSOURCE_EDITION diff --git a/qmake/qmake.pro b/qmake/qmake.pro index 00dcbce..f3f9d53 100644 --- a/qmake/qmake.pro +++ b/qmake/qmake.pro @@ -27,5 +27,9 @@ INCPATH += generators \ $$QT_SOURCE_TREE/include \ $$QT_SOURCE_TREE/include/QtCore \ $$QT_SOURCE_TREE/qmake + +VPATH += $$QT_SOURCE_TREE/tools/shared +INCPATH += $$QT_SOURCE_TREE/tools/shared + include(qmake.pri) diff --git a/src/corelib/arch/qatomic_s390.h b/src/corelib/arch/qatomic_s390.h index 21f5037..273c17b 100644 --- a/src/corelib/arch/qatomic_s390.h +++ b/src/corelib/arch/qatomic_s390.h @@ -366,11 +366,9 @@ template <typename T> Q_INLINE_TEMPLATE T* QBasicAtomicPointer<T>::fetchAndStoreRelaxed(T *newValue) { #ifndef __s390x__ - return (T*)__CS_OLD_LOOP(reinterpret_cast<volatile long*>(_q_value), (int)newValue, "lr", - "", "bcr 15,0\n"); + return (T*)__CS_OLD_LOOP(&_q_value, (int)newValue, "lr", "", ""); #else - return (T*)__CSG_OLD_LOOP(reinterpret_cast<volatile long*>(_q_value), (long)newValue, "lgr", - "", "bcr 15,0\n"); + return (T*)__CSG_OLD_LOOP(&_q_value, (long)newValue, "lgr", "", ""); #endif } @@ -378,9 +376,9 @@ template <typename T> Q_INLINE_TEMPLATE T* QBasicAtomicPointer<T>::fetchAndStoreAcquire(T *newValue) { #ifndef __s390x__ - return (T*)__CS_OLD_LOOP(reinterpret_cast<volatile long*>(_q_value), (int)newValue, "lr", "", ""); + return (T*)__CS_OLD_LOOP(&_q_value, (int)newValue, "lr", "", "bcr 15,0 \n"); #else - return (T*)__CSG_OLD_LOOP(reinterpret_cast<volatile long*>(_q_value), (long)newValue, "lgr", "", ""); + return (T*)__CSG_OLD_LOOP(&_q_value, (long)newValue, "lgr", "", "bcr 15,0 \n"); #endif } @@ -388,11 +386,9 @@ template <typename T> Q_INLINE_TEMPLATE T* QBasicAtomicPointer<T>::fetchAndStoreRelease(T *newValue) { #ifndef __s390x__ - return (T*)__CS_OLD_LOOP(reinterpret_cast<volatile long*>(_q_value), (int)newValue, "lr", - "bcr 15,0 \n", ""); + return (T*)__CS_OLD_LOOP(&_q_value, (int)newValue, "lr", "bcr 15,0 \n", ""); #else - return (T*)__CSG_OLD_LOOP(reinterpret_cast<volatile long*>(_q_value), (long)newValue, "lgr", - "bcr 15,0\n", ""); + return (T*)__CSG_OLD_LOOP(&_q_value, (long)newValue, "lgr", "bcr 15,0\n", ""); #endif } diff --git a/src/corelib/arch/qatomic_symbian.h b/src/corelib/arch/qatomic_symbian.h index f1d332f..fa4e4a9 100644 --- a/src/corelib/arch/qatomic_symbian.h +++ b/src/corelib/arch/qatomic_symbian.h @@ -42,7 +42,7 @@ #ifndef QATOMIC_SYMBIAN_H #define QATOMIC_SYMBIAN_H -#include <qglobal.h> +#include <QtCore/qglobal.h> #include <e32std.h> QT_BEGIN_HEADER diff --git a/src/corelib/codecs/qtextcodec.cpp b/src/corelib/codecs/qtextcodec.cpp index 1c607a6..ca5e658 100644 --- a/src/corelib/codecs/qtextcodec.cpp +++ b/src/corelib/codecs/qtextcodec.cpp @@ -80,6 +80,7 @@ #endif // QT_NO_CODECS #include "qlocale.h" #include "qmutex.h" +#include "qhash.h" #include <stdlib.h> #include <ctype.h> @@ -172,6 +173,7 @@ static QTextCodec *createForMib(int mib) } static QList<QTextCodec*> *all = 0; +static int clearCaches = 0; // flags specifying if caches should be invalided: 0x1 codecForName, 0x2 codecForMib #ifdef Q_DEBUG_TEXTCODEC static bool destroying_is_ok = false; #endif @@ -935,6 +937,7 @@ QTextCodec::~QTextCodec() QMutexLocker locker(textCodecsMutex()); #endif all->removeAll(this); + clearCaches = 0x1 | 0x2; } } @@ -961,17 +964,33 @@ QTextCodec *QTextCodec::codecForName(const QByteArray &name) #endif setup(); + static QHash <QByteArray, QTextCodec *> cache; + if (clearCaches & 0x1) { + cache.clear(); + clearCaches &= ~0x1; + } + QTextCodec *codec = cache.value(name); + if (codec) + return codec; + for (int i = 0; i < all->size(); ++i) { QTextCodec *cursor = all->at(i); - if (nameMatch(cursor->name(), name)) + if (nameMatch(cursor->name(), name)) { + cache.insert(name, cursor); return cursor; + } QList<QByteArray> aliases = cursor->aliases(); for (int y = 0; y < aliases.size(); ++y) - if (nameMatch(aliases.at(y), name)) + if (nameMatch(aliases.at(y), name)) { + cache.insert(name, cursor); return cursor; + } } - return createForName(name); + codec = createForName(name); + if (codec) + cache.insert(name, codec); + return codec; } @@ -986,19 +1005,34 @@ QTextCodec* QTextCodec::codecForMib(int mib) #endif setup(); - // Qt 3 used 1000 (mib for UCS2) as its identifier for the utf16 codec. Map - // this correctly for compatibility. - if (mib == 1000) - mib = 1015; + static QHash <int, QTextCodec *> cache; + if (clearCaches & 0x2) { + cache.clear(); + clearCaches &= ~0x2; + } + QTextCodec *codec = cache.value(mib); + if (codec) + return codec; QList<QTextCodec*>::ConstIterator i; for (int i = 0; i < all->size(); ++i) { QTextCodec *cursor = all->at(i); - if (cursor->mibEnum() == mib) + if (cursor->mibEnum() == mib) { + cache.insert(mib, cursor); return cursor; + } } - return createForMib(mib); + codec = createForMib(mib); + + // Qt 3 used 1000 (mib for UCS2) as its identifier for the utf16 codec. Map + // this correctly for compatibility. + if (!codec && mib == 1000) + return codecForMib(1015); + + if (codec) + cache.insert(mib, codec); + return codec; } /*! diff --git a/src/corelib/concurrent/qfuture.h b/src/corelib/concurrent/qfuture.h index e402335..02ae40a 100644 --- a/src/corelib/concurrent/qfuture.h +++ b/src/corelib/concurrent/qfuture.h @@ -111,7 +111,7 @@ public: { public: typedef std::bidirectional_iterator_tag iterator_category; - typedef ptrdiff_t difference_type; + typedef qptrdiff difference_type; typedef T value_type; typedef const T *pointer; typedef const T &reference; diff --git a/src/corelib/corelib.pro b/src/corelib/corelib.pro index 9a15bf1..efee610 100644 --- a/src/corelib/corelib.pro +++ b/src/corelib/corelib.pro @@ -35,4 +35,20 @@ symbian: { # Workaroud for problems with paging this dll MMP_RULES -= PAGED MMP_RULES *= UNPAGED + + # Partial upgrade SIS file + vendorinfo = \ + "&EN" \ + "; Localised Vendor name" \ + "%{\"Nokia, Qt\"}" \ + " " \ + "; Unique Vendor name" \ + ":\"Nokia, Qt\"" \ + " " + pu_header = "; Partial upgrade package for testing QtCore changes without reinstalling everything" \ + "$${LITERAL_HASH}{\"Qt corelib\"}, (0x2001E61C), $${QT_MAJOR_VERSION},$${QT_MINOR_VERSION},$${QT_PATCH_VERSION}, TYPE=PU" + partial_upgrade.pkg_prerules = pu_header vendorinfo + partial_upgrade.sources = qtcore.dll + partial_upgrade.path = c:/sys/bin + DEPLOYMENT = partial_upgrade $$DEPLOYMENT } diff --git a/src/corelib/io/qdatastream.cpp b/src/corelib/io/qdatastream.cpp index 7c1887e..fc35bfa 100644 --- a/src/corelib/io/qdatastream.cpp +++ b/src/corelib/io/qdatastream.cpp @@ -157,6 +157,13 @@ QT_BEGIN_NAMESPACE data, followed by the data. Note that any encoding/decoding of the data (apart from the length quint32) must be done by you. + \section1 Reading and writing Qt collection classes + + The Qt collection classes can also be serialized to a QDataStream. + These include QList, QLinkedList, QVector, QSet, QHash, and QMap. + These classes have have stream operators declared as non-member of + the class. + \target Serializing Qt Classes \section1 Reading and writing other Qt classes. diff --git a/src/corelib/io/qfilesystemwatcher_kqueue.cpp b/src/corelib/io/qfilesystemwatcher_kqueue.cpp index 8396481..99c165e 100644 --- a/src/corelib/io/qfilesystemwatcher_kqueue.cpp +++ b/src/corelib/io/qfilesystemwatcher_kqueue.cpp @@ -260,12 +260,22 @@ void QKqueueFileSystemWatcherEngine::run() DEBUG() << "QKqueueFileSystemWatcherEngine: processing kevent" << kev.ident << kev.filter; if (fd == kqpipe[0]) { - char c; - if (read(kqpipe[0], &c, 1) != 1) { + // read all pending data from the pipe + QByteArray ba; + ba.resize(kev.data); + if (read(kqpipe[0], ba.data(), ba.size()) != ba.size()) { perror("QKqueueFileSystemWatcherEngine: error reading from pipe"); return; } - switch (c) { + // read the command from the buffer (but break and return on 'q') + char cmd = 0; + for (int i = 0; i < ba.size(); ++i) { + cmd = ba.constData()[i]; + if (cmd == 'q') + break; + } + // handle the command + switch (cmd) { case 'q': DEBUG() << "QKqueueFileSystemWatcherEngine: thread received 'q', exiting..."; return; @@ -273,7 +283,7 @@ void QKqueueFileSystemWatcherEngine::run() DEBUG() << "QKqueueFileSystemWatcherEngine: thread received '@', continuing..."; break; default: - DEBUG() << "QKqueueFileSystemWatcherEngine: thread received unknow message" << c; + DEBUG() << "QKqueueFileSystemWatcherEngine: thread received unknow message" << cmd; break; } } else { diff --git a/src/corelib/io/qfsfileengine_win.cpp b/src/corelib/io/qfsfileengine_win.cpp index eb99f27..d8b1c03 100644 --- a/src/corelib/io/qfsfileengine_win.cpp +++ b/src/corelib/io/qfsfileengine_win.cpp @@ -1479,7 +1479,7 @@ QAbstractFileEngine::FileFlags QFSFileEnginePrivate::getPermissions() const { //### what to do with permissions if we don't use NTFS // for now just add all permissions and what about exe missions ?? - // also qt_ntfs_permission_lookup is now not set by defualt ... should it ? + // also qt_ntfs_permission_lookup is now not set by default ... should it ? ret |= QAbstractFileEngine::ReadOtherPerm | QAbstractFileEngine::ReadGroupPerm | QAbstractFileEngine::ReadOwnerPerm | QAbstractFileEngine::ReadUserPerm | QAbstractFileEngine::WriteUserPerm | QAbstractFileEngine::WriteOwnerPerm diff --git a/src/corelib/kernel/qeventdispatcher_win.cpp b/src/corelib/kernel/qeventdispatcher_win.cpp index 7c8fb3d..4755540 100644 --- a/src/corelib/kernel/qeventdispatcher_win.cpp +++ b/src/corelib/kernel/qeventdispatcher_win.cpp @@ -68,6 +68,14 @@ extern uint qGlobalPostedEventsCount(); # define QS_RAWINPUT 0x0400 #endif +#ifndef WM_TOUCH +# define WM_TOUCH 0x0240 +#endif +#ifndef WM_GESTURE +# define WM_GESTURE 0x0119 +# define WM_GESTURENOTIFY 0x011A +#endif + enum { WM_QT_SOCKETNOTIFIER = WM_USER, WM_QT_SENDPOSTEDEVENTS = WM_USER + 1, @@ -517,8 +525,8 @@ LRESULT CALLBACK qt_GetMessageHook(int code, WPARAM wp, LPARAM lp) MSG *msg = (MSG *) lp; if (localSerialNumber != d->lastSerialNumber // if this message IS the one that triggers sendPostedEvents(), no need to post it again - && msg->hwnd != d->internalHwnd - && msg->message != WM_QT_SENDPOSTEDEVENTS) { + && (msg->hwnd != d->internalHwnd + || msg->message != WM_QT_SENDPOSTEDEVENTS)) { PostMessage(d->internalHwnd, WM_QT_SENDPOSTEDEVENTS, 0, 0); } } @@ -729,6 +737,9 @@ bool QEventDispatcherWin32::processEvents(QEventLoop::ProcessEventsFlags flags) && msg.message <= WM_MOUSELAST) || msg.message == WM_MOUSEWHEEL || msg.message == WM_MOUSEHWHEEL + || msg.message == WM_TOUCH + || msg.message == WM_GESTURE + || msg.message == WM_GESTURENOTIFY || msg.message == WM_CLOSE)) { // queue user input events for later processing haveMessage = false; diff --git a/src/corelib/tools/qcontiguouscache.h b/src/corelib/tools/qcontiguouscache.h index 1f7fdb2..f767962 100644 --- a/src/corelib/tools/qcontiguouscache.h +++ b/src/corelib/tools/qcontiguouscache.h @@ -97,7 +97,7 @@ public: typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; - typedef ptrdiff_t difference_type; + typedef qptrdiff difference_type; typedef int size_type; explicit QContiguousCache(int capacity = 0); @@ -221,22 +221,29 @@ void QContiguousCache<T>::setCapacity(int asize) x.d->alloc = asize; x.d->count = qMin(d->count, asize); x.d->offset = d->offset + d->count - x.d->count; - x.d->start = x.d->offset % x.d->alloc; - T *dest = x.p->array + (x.d->start + x.d->count-1) % x.d->alloc; - T *src = p->array + (d->start + d->count-1) % d->alloc; + if(asize) + x.d->start = x.d->offset % x.d->alloc; + else + x.d->start = 0; + int oldcount = x.d->count; - while (oldcount--) { - if (QTypeInfo<T>::isComplex) { - new (dest) T(*src); - } else { - *dest = *src; + if(oldcount) + { + T *dest = x.p->array + (x.d->start + x.d->count-1) % x.d->alloc; + T *src = p->array + (d->start + d->count-1) % d->alloc; + while (oldcount--) { + if (QTypeInfo<T>::isComplex) { + new (dest) T(*src); + } else { + *dest = *src; + } + if (dest == x.p->array) + dest = x.p->array + x.d->alloc; + dest--; + if (src == p->array) + src = p->array + d->alloc; + src--; } - if (dest == x.p->array) - dest = x.p->array + x.d->alloc; - dest--; - if (src == p->array) - src = p->array + d->alloc; - src--; } /* free old */ free(p); diff --git a/src/corelib/tools/qhash.h b/src/corelib/tools/qhash.h index 2832ca2..f1030ae 100644 --- a/src/corelib/tools/qhash.h +++ b/src/corelib/tools/qhash.h @@ -330,7 +330,7 @@ public: public: typedef std::bidirectional_iterator_tag iterator_category; - typedef ptrdiff_t difference_type; + typedef qptrdiff difference_type; typedef T value_type; typedef T *pointer; typedef T &reference; @@ -395,7 +395,7 @@ public: public: typedef std::bidirectional_iterator_tag iterator_category; - typedef ptrdiff_t difference_type; + typedef qptrdiff difference_type; typedef T value_type; typedef const T *pointer; typedef const T &reference; @@ -479,7 +479,7 @@ public: // STL compatibility typedef T mapped_type; typedef Key key_type; - typedef ptrdiff_t difference_type; + typedef qptrdiff difference_type; typedef int size_type; inline bool empty() const { return isEmpty(); } diff --git a/src/corelib/tools/qlinkedlist.h b/src/corelib/tools/qlinkedlist.h index fe586a4..d145fe3 100644 --- a/src/corelib/tools/qlinkedlist.h +++ b/src/corelib/tools/qlinkedlist.h @@ -114,7 +114,7 @@ public: { public: typedef std::bidirectional_iterator_tag iterator_category; - typedef ptrdiff_t difference_type; + typedef qptrdiff difference_type; typedef T value_type; typedef T *pointer; typedef T &reference; @@ -147,7 +147,7 @@ public: { public: typedef std::bidirectional_iterator_tag iterator_category; - typedef ptrdiff_t difference_type; + typedef qptrdiff difference_type; typedef T value_type; typedef const T *pointer; typedef const T &reference; @@ -213,7 +213,7 @@ public: typedef const value_type *const_pointer; typedef value_type &reference; typedef const value_type &const_reference; - typedef ptrdiff_t difference_type; + typedef qptrdiff difference_type; #ifndef QT_NO_STL static inline QLinkedList<T> fromStdList(const std::list<T> &list) diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h index 8c75c98..5364e8e 100644 --- a/src/corelib/tools/qlist.h +++ b/src/corelib/tools/qlist.h @@ -166,7 +166,7 @@ public: public: Node *i; typedef std::random_access_iterator_tag iterator_category; - typedef ptrdiff_t difference_type; + typedef qptrdiff difference_type; typedef T value_type; typedef T *pointer; typedef T &reference; @@ -213,7 +213,7 @@ public: public: Node *i; typedef std::random_access_iterator_tag iterator_category; - typedef ptrdiff_t difference_type; + typedef qptrdiff difference_type; typedef T value_type; typedef const T *pointer; typedef const T &reference; @@ -292,7 +292,7 @@ public: typedef const value_type *const_pointer; typedef value_type &reference; typedef const value_type &const_reference; - typedef ptrdiff_t difference_type; + typedef qptrdiff difference_type; #ifdef QT3_SUPPORT inline QT3_SUPPORT iterator remove(iterator pos) { return erase(pos); } diff --git a/src/corelib/tools/qmap.h b/src/corelib/tools/qmap.h index 9ba9ca5..2e21547 100644 --- a/src/corelib/tools/qmap.h +++ b/src/corelib/tools/qmap.h @@ -214,7 +214,7 @@ public: public: typedef std::bidirectional_iterator_tag iterator_category; - typedef ptrdiff_t difference_type; + typedef qptrdiff difference_type; typedef T value_type; typedef T *pointer; typedef T &reference; @@ -282,7 +282,7 @@ public: public: typedef std::bidirectional_iterator_tag iterator_category; - typedef ptrdiff_t difference_type; + typedef qptrdiff difference_type; typedef T value_type; typedef const T *pointer; typedef const T &reference; @@ -385,7 +385,7 @@ public: // STL compatibility typedef Key key_type; typedef T mapped_type; - typedef ptrdiff_t difference_type; + typedef qptrdiff difference_type; typedef int size_type; inline bool empty() const { return isEmpty(); } diff --git a/src/corelib/tools/qset.h b/src/corelib/tools/qset.h index 9acbed4..fe50d4d 100644 --- a/src/corelib/tools/qset.h +++ b/src/corelib/tools/qset.h @@ -97,7 +97,7 @@ public: public: typedef std::bidirectional_iterator_tag iterator_category; - typedef ptrdiff_t difference_type; + typedef qptrdiff difference_type; typedef T value_type; typedef const T *pointer; typedef const T &reference; @@ -132,7 +132,7 @@ public: public: typedef std::bidirectional_iterator_tag iterator_category; - typedef ptrdiff_t difference_type; + typedef qptrdiff difference_type; typedef T value_type; typedef const T *pointer; typedef const T &reference; @@ -188,11 +188,10 @@ public: typedef const value_type *const_pointer; typedef value_type &reference; typedef const value_type &const_reference; - typedef ptrdiff_t difference_type; + typedef qptrdiff difference_type; typedef int size_type; inline bool empty() const { return isEmpty(); } - // comfort inline QSet<T> &operator<<(const T &value) { insert(value); return *this; } inline QSet<T> &operator|=(const QSet<T> &other) { unite(other); return *this; } diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h index 0dcea5f..d85c248 100644 --- a/src/corelib/tools/qsharedpointer_impl.h +++ b/src/corelib/tools/qsharedpointer_impl.h @@ -132,7 +132,7 @@ namespace QtSharedPointer { typedef const value_type *const_pointer; typedef value_type &reference; typedef const value_type &const_reference; - typedef ptrdiff_t difference_type; + typedef qptrdiff difference_type; inline T *data() const { return value; } inline bool isNull() const { return !data(); } @@ -541,7 +541,7 @@ public: typedef const value_type *const_pointer; typedef value_type &reference; typedef const value_type &const_reference; - typedef ptrdiff_t difference_type; + typedef qptrdiff difference_type; inline bool isNull() const { return d == 0 || d->strongref == 0 || value == 0; } #ifndef Q_CC_NOKIAX86 diff --git a/src/corelib/tools/qvector.h b/src/corelib/tools/qvector.h index 2fc4d6c..c2e2485 100644 --- a/src/corelib/tools/qvector.h +++ b/src/corelib/tools/qvector.h @@ -164,7 +164,7 @@ public: public: T *i; typedef std::random_access_iterator_tag iterator_category; - typedef ptrdiff_t difference_type; + typedef qptrdiff difference_type; typedef T value_type; typedef T *pointer; typedef T &reference; @@ -197,7 +197,7 @@ public: public: T *i; typedef std::random_access_iterator_tag iterator_category; - typedef ptrdiff_t difference_type; + typedef qptrdiff difference_type; typedef T value_type; typedef const T *pointer; typedef const T &reference; @@ -261,7 +261,7 @@ public: typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; - typedef ptrdiff_t difference_type; + typedef qptrdiff difference_type; typedef iterator Iterator; typedef const_iterator ConstIterator; typedef int size_type; diff --git a/src/corelib/xml/qxmlstream_p.h b/src/corelib/xml/qxmlstream_p.h index 6b911d2..ac421cf 100644 --- a/src/corelib/xml/qxmlstream_p.h +++ b/src/corelib/xml/qxmlstream_p.h @@ -54,7 +54,7 @@ #ifndef QXMLSTREAM_P_H #define QXMLSTREAM_P_H -#if defined(Q_OS_VXWORKS) && defined(ERROR) +#if defined(ERROR) # undef ERROR #endif diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp index 44abf7b..6cb4924 100644 --- a/src/dbus/qdbusintegrator.cpp +++ b/src/dbus/qdbusintegrator.cpp @@ -1937,7 +1937,7 @@ int QDBusConnectionPrivate::sendWithReplyAsync(const QDBusMessage &message, QObj QDBusPendingCallPrivate *pcall = sendWithReplyAsync(message, timeout); Q_ASSERT(pcall); - // has it already finished (dispatched locally)? + // has it already finished with success (dispatched locally)? if (pcall->replyMessage.type() == QDBusMessage::ReplyMessage) { pcall->setReplyCallback(receiver, returnMethod); processFinishedCall(pcall); @@ -1945,33 +1945,24 @@ int QDBusConnectionPrivate::sendWithReplyAsync(const QDBusMessage &message, QObj return 1; } + // either it hasn't finished or it has finished with error + if (errorMethod) { + pcall->watcherHelper = new QDBusPendingCallWatcherHelper; + connect(pcall->watcherHelper, SIGNAL(error(QDBusError,QDBusMessage)), receiver, errorMethod, + Qt::QueuedConnection); + pcall->watcherHelper->moveToThread(thread()); + } + // has it already finished and is an error reply message? if (pcall->replyMessage.type() == QDBusMessage::ErrorMessage) { - if (errorMethod) { - pcall->watcherHelper = new QDBusPendingCallWatcherHelper; - connect(pcall->watcherHelper, SIGNAL(error(QDBusError,QDBusMessage)), receiver, errorMethod); - pcall->watcherHelper->moveToThread(thread()); - } processFinishedCall(pcall); delete pcall; return 1; } - // has it already finished with error? - if (pcall->replyMessage.type() != QDBusMessage::InvalidMessage) { - delete pcall; - return 0; - } - pcall->autoDelete = true; pcall->ref.ref(); - pcall->setReplyCallback(receiver, returnMethod); - if (errorMethod) { - pcall->watcherHelper = new QDBusPendingCallWatcherHelper; - connect(pcall->watcherHelper, SIGNAL(error(QDBusError,QDBusMessage)), receiver, errorMethod); - pcall->watcherHelper->moveToThread(thread()); - } return 1; } diff --git a/src/gui/dialogs/qcolordialog.cpp b/src/gui/dialogs/qcolordialog.cpp index 83ecc30..e6abf7f 100644 --- a/src/gui/dialogs/qcolordialog.cpp +++ b/src/gui/dialogs/qcolordialog.cpp @@ -1078,8 +1078,7 @@ QColorShower::QColorShower(QColorDialog *parent) #ifdef QT_SMALL_COLORDIALOG # ifdef Q_WS_S60 - QS60Data s60Data = QS60Data(); - const bool nonTouchUI = !s60Data.hasTouchscreen; + const bool nonTouchUI = !S60->hasTouchscreen; # elif defined Q_WS_MAEMO_5 const bool nonTouchUI = false; # endif @@ -1506,8 +1505,7 @@ void QColorDialogPrivate::init(const QColor &initial) #if defined(QT_SMALL_COLORDIALOG) # if defined(Q_WS_S60) - QS60Data s60Data = QS60Data(); - const bool nonTouchUI = !s60Data.hasTouchscreen; + const bool nonTouchUI = !S60->hasTouchscreen; # elif defined(Q_WS_MAEMO_5) const bool nonTouchUI = false; # endif diff --git a/src/gui/effects/qgraphicseffect.cpp b/src/gui/effects/qgraphicseffect.cpp index 10ef5ea..ce4ce6a 100644 --- a/src/gui/effects/qgraphicseffect.cpp +++ b/src/gui/effects/qgraphicseffect.cpp @@ -699,12 +699,17 @@ void QGraphicsColorizeEffect::draw(QPainter *painter) if (sourceIsPixmap()) { // No point in drawing in device coordinates (pixmap will be scaled anyways). const QPixmap pixmap = sourcePixmap(Qt::LogicalCoordinates, &offset, NoPad); - d->filter->draw(painter, offset, pixmap); + if (!pixmap.isNull()) + d->filter->draw(painter, offset, pixmap); + return; } // Draw pixmap in deviceCoordinates to avoid pixmap scaling. const QPixmap pixmap = sourcePixmap(Qt::DeviceCoordinates, &offset); + if (pixmap.isNull()) + return; + QTransform restoreTransform = painter->worldTransform(); painter->setWorldTransform(QTransform()); d->filter->draw(painter, offset, pixmap); @@ -721,7 +726,8 @@ void QGraphicsColorizeEffect::draw(QPainter *painter) elements. The level of detail can be modified using the setBlurRadius() function. Use setBlurHints() to choose the blur hints. - By default, the blur radius is 5 pixels. + By default, the blur radius is 5 pixels. The blur radius is specified in + device coordinates. \img graphicseffect-blur.png @@ -776,6 +782,9 @@ QGraphicsBlurEffect::~QGraphicsBlurEffect() radius results in a more blurred appearance. By default, the blur radius is 5 pixels. + + The radius is given in device coordinates, meaning it is + unaffected by scale. */ qreal QGraphicsBlurEffect::blurRadius() const { @@ -858,9 +867,11 @@ void QGraphicsBlurEffect::draw(QPainter *painter) if (painter->paintEngine()->type() == QPaintEngine::OpenGL2) mode = NoPad; - // Draw pixmap in device coordinates to avoid pixmap scaling. QPoint offset; QPixmap pixmap = sourcePixmap(Qt::LogicalCoordinates, &offset, mode); + if (pixmap.isNull()) + return; + d->filter->draw(painter, offset, pixmap); } @@ -877,7 +888,8 @@ void QGraphicsBlurEffect::draw(QPainter *painter) By default, the drop shadow is a semi-transparent dark gray (QColor(63, 63, 63, 180)) shadow, blurred with a radius of 1 at an offset - of 8 pixels towards the lower right. + of 8 pixels towards the lower right. The drop shadow offset is specified + in device coordinates. \img graphicseffect-drop-shadow.png @@ -906,6 +918,9 @@ QGraphicsDropShadowEffect::~QGraphicsDropShadowEffect() By default, the offset is 8 pixels towards the lower right. + The offset is given in device coordinates, which means it is + unaffected by scale. + \sa xOffset(), yOffset(), blurRadius(), color() */ QPointF QGraphicsDropShadowEffect::offset() const @@ -1047,6 +1062,9 @@ void QGraphicsDropShadowEffect::draw(QPainter *painter) // Draw pixmap in device coordinates to avoid pixmap scaling. QPoint offset; const QPixmap pixmap = sourcePixmap(Qt::DeviceCoordinates, &offset, mode); + if (pixmap.isNull()) + return; + QTransform restoreTransform = painter->worldTransform(); painter->setWorldTransform(QTransform()); d->filter->draw(painter, offset, pixmap); diff --git a/src/gui/egl/qegl.cpp b/src/gui/egl/qegl.cpp index ae3d6c3..0ed95ea 100644 --- a/src/gui/egl/qegl.cpp +++ b/src/gui/egl/qegl.cpp @@ -54,9 +54,10 @@ QT_BEGIN_NAMESPACE static QEglContext * volatile currentGLContext = 0; static QEglContext * volatile currentVGContext = 0; +EGLDisplay QEglContext::dpy = EGL_NO_DISPLAY; + QEglContext::QEglContext() : apiType(QEgl::OpenGL) - , dpy(EGL_NO_DISPLAY) , ctx(EGL_NO_CONTEXT) , cfg(0) , currentSurface(EGL_NO_SURFACE) @@ -68,7 +69,7 @@ QEglContext::QEglContext() QEglContext::~QEglContext() { - destroy(); + destroyContext(); if (currentGLContext == this) currentGLContext = 0; @@ -86,14 +87,6 @@ bool QEglContext::isCurrent() const return current; } -// Open the EGL display associated with "device". -bool QEglContext::openDisplay(QPaintDevice *device) -{ - if (dpy == EGL_NO_DISPLAY) - dpy = defaultDisplay(device); - return (dpy != EGL_NO_DISPLAY); -} - // Choose a configuration that matches "properties". bool QEglContext::chooseConfig (const QEglProperties& properties, QEgl::PixelFormatMatch match) @@ -102,13 +95,13 @@ bool QEglContext::chooseConfig do { // Get the number of matching configurations for this set of properties. EGLint matching = 0; - if (!eglChooseConfig(dpy, props.properties(), 0, 0, &matching) || !matching) + if (!eglChooseConfig(display(), props.properties(), 0, 0, &matching) || !matching) continue; // If we want the best pixel format, then return the first // matching configuration. if (match == QEgl::BestPixelFormat) { - eglChooseConfig(dpy, props.properties(), &cfg, 1, &matching); + eglChooseConfig(display(), props.properties(), &cfg, 1, &matching); if (matching < 1) continue; return true; @@ -118,13 +111,13 @@ bool QEglContext::chooseConfig // first that matches the pixel format we wanted. EGLint size = matching; EGLConfig *configs = new EGLConfig [size]; - eglChooseConfig(dpy, props.properties(), configs, size, &matching); + eglChooseConfig(display(), props.properties(), configs, size, &matching); for (EGLint index = 0; index < size; ++index) { EGLint red, green, blue, alpha; - eglGetConfigAttrib(dpy, configs[index], EGL_RED_SIZE, &red); - eglGetConfigAttrib(dpy, configs[index], EGL_GREEN_SIZE, &green); - eglGetConfigAttrib(dpy, configs[index], EGL_BLUE_SIZE, &blue); - eglGetConfigAttrib(dpy, configs[index], EGL_ALPHA_SIZE, &alpha); + eglGetConfigAttrib(display(), configs[index], EGL_RED_SIZE, &red); + eglGetConfigAttrib(display(), configs[index], EGL_GREEN_SIZE, &green); + eglGetConfigAttrib(display(), configs[index], EGL_BLUE_SIZE, &blue); + eglGetConfigAttrib(display(), configs[index], EGL_ALPHA_SIZE, &alpha); if (red == props.value(EGL_RED_SIZE) && green == props.value(EGL_GREEN_SIZE) && blue == props.value(EGL_BLUE_SIZE) && @@ -179,7 +172,7 @@ bool QEglContext::createContext(QEglContext *shareContext, const QEglProperties if (shareContext && shareContext->ctx == EGL_NO_CONTEXT) shareContext = 0; if (shareContext) { - ctx = eglCreateContext(dpy, cfg, shareContext->ctx, contextProps.properties()); + ctx = eglCreateContext(display(), cfg, shareContext->ctx, contextProps.properties()); if (ctx == EGL_NO_CONTEXT) { qWarning() << "QEglContext::createContext(): Could not share context:" << errorString(eglGetError()); shareContext = 0; @@ -188,7 +181,7 @@ bool QEglContext::createContext(QEglContext *shareContext, const QEglProperties } } if (ctx == EGL_NO_CONTEXT) { - ctx = eglCreateContext(dpy, cfg, 0, contextProps.properties()); + ctx = eglCreateContext(display(), cfg, 0, contextProps.properties()); if (ctx == EGL_NO_CONTEXT) { qWarning() << "QEglContext::createContext(): Unable to create EGL context:" << errorString(eglGetError()); return false; @@ -204,16 +197,15 @@ void QEglContext::destroySurface(EGLSurface surface) if (surface != EGL_NO_SURFACE) { if (surface == currentSurface) doneCurrent(); - eglDestroySurface(dpy, surface); + eglDestroySurface(display(), surface); } } // Destroy the context. Note: this does not destroy the surface. -void QEglContext::destroy() +void QEglContext::destroyContext() { if (ctx != EGL_NO_CONTEXT && ownsContext) - eglDestroyContext(dpy, ctx); - dpy = EGL_NO_DISPLAY; + eglDestroyContext(display(), ctx); ctx = EGL_NO_CONTEXT; cfg = 0; } @@ -248,7 +240,7 @@ bool QEglContext::makeCurrent(EGLSurface surface) eglBindAPI(EGL_OPENVG_API); #endif - bool ok = eglMakeCurrent(dpy, surface, surface, ctx); + bool ok = eglMakeCurrent(display(), surface, surface, ctx); if (!ok) qWarning() << "QEglContext::makeCurrent():" << errorString(eglGetError()); return ok; @@ -277,7 +269,7 @@ bool QEglContext::doneCurrent() eglBindAPI(EGL_OPENVG_API); #endif - bool ok = eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + bool ok = eglMakeCurrent(display(), EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); if (!ok) qWarning() << "QEglContext::doneCurrent():" << errorString(eglGetError()); return ok; @@ -299,7 +291,7 @@ bool QEglContext::swapBuffers(EGLSurface surface) if(ctx == EGL_NO_CONTEXT) return false; - bool ok = eglSwapBuffers(dpy, surface); + bool ok = eglSwapBuffers(display(), surface); if (!ok) qWarning() << "QEglContext::swapBuffers():" << errorString(eglGetError()); return ok; @@ -338,7 +330,7 @@ void QEglContext::waitClient() // Query the value of a configuration attribute. bool QEglContext::configAttrib(int name, EGLint *value) const { - return eglGetConfigAttrib(dpy, cfg, name, value); + return eglGetConfigAttrib(display(), cfg, name, value); } // Retrieve all of the properties on "cfg". If zero, return @@ -350,34 +342,45 @@ QEglProperties QEglContext::configProperties(EGLConfig cfg) const QEglProperties props; for (int name = 0x3020; name <= 0x304F; ++name) { EGLint value; - if (name != EGL_NONE && eglGetConfigAttrib(dpy, cfg, name, &value)) + if (name != EGL_NONE && eglGetConfigAttrib(display(), cfg, name, &value)) props.setValue(name, value); } eglGetError(); // Clear the error state. return props; } -// Initialize and return the default display. -EGLDisplay QEglContext::defaultDisplay(QPaintDevice *device) +EGLDisplay QEglContext::display() { - static EGLDisplay dpy = EGL_NO_DISPLAY; - if (dpy == EGL_NO_DISPLAY) { - dpy = getDisplay(device); + static bool openedDisplay = false; + + if (!openedDisplay) { + dpy = eglGetDisplay(nativeDisplay()); + openedDisplay = true; + if (dpy == EGL_NO_DISPLAY) { + qWarning("QEglContext::display(): Falling back to EGL_DEFAULT_DISPLAY"); + dpy = eglGetDisplay(EGLNativeDisplayType(EGL_DEFAULT_DISPLAY)); + } if (dpy == EGL_NO_DISPLAY) { - qWarning() << "QEglContext::defaultDisplay(): Cannot open EGL display"; + qWarning("QEglContext::display(): Can't even open the default display"); return EGL_NO_DISPLAY; } + if (!eglInitialize(dpy, NULL, NULL)) { - qWarning() << "QEglContext::defaultDisplay(): Cannot initialize EGL display:" << errorString(eglGetError()); + qWarning() << "QEglContext::display(): Cannot initialize EGL display:" << errorString(eglGetError()); return EGL_NO_DISPLAY; } -#ifdef EGL_OPENGL_ES_API - eglBindAPI(EGL_OPENGL_ES_API); -#endif } + return dpy; } +#if !defined(Q_WS_X11) && !defined(Q_WS_WINCE) // WinCE & X11 implement this properly +EGLNativeDisplayType QEglContext::nativeDisplay() +{ + return EGL_DEFAULT_DISPLAY; +} +#endif + // Return the error string associated with a specific code. QString QEglContext::errorString(EGLint code) { @@ -410,10 +413,10 @@ void QEglContext::dumpAllConfigs() { QEglProperties props; EGLint count = 0; - if (!eglGetConfigs(dpy, 0, 0, &count) || count < 1) + if (!eglGetConfigs(display(), 0, 0, &count) || count < 1) return; EGLConfig *configs = new EGLConfig [count]; - eglGetConfigs(dpy, configs, count, &count); + eglGetConfigs(display(), configs, count, &count); for (EGLint index = 0; index < count; ++index) { props = configProperties(configs[index]); qWarning() << props.toString(); @@ -423,7 +426,7 @@ void QEglContext::dumpAllConfigs() QString QEglContext::extensions() { - const char* exts = eglQueryString(QEglContext::defaultDisplay(0), EGL_EXTENSIONS); + const char* exts = eglQueryString(QEglContext::display(), EGL_EXTENSIONS); return QString(QLatin1String(exts)); } @@ -431,7 +434,7 @@ bool QEglContext::hasExtension(const char* extensionName) { QList<QByteArray> extensions = QByteArray(reinterpret_cast<const char *> - (eglQueryString(QEglContext::defaultDisplay(0), EGL_EXTENSIONS))).split(' '); + (eglQueryString(QEglContext::display(), EGL_EXTENSIONS))).split(' '); return extensions.contains(extensionName); } diff --git a/src/gui/egl/qegl_p.h b/src/gui/egl/qegl_p.h index a7de9c8..87ed818 100644 --- a/src/gui/egl/qegl_p.h +++ b/src/gui/egl/qegl_p.h @@ -86,14 +86,12 @@ public: QEgl::API api() const { return apiType; } void setApi(QEgl::API api) { apiType = api; } - bool openDisplay(QPaintDevice *device); bool chooseConfig(const QEglProperties& properties, QEgl::PixelFormatMatch match = QEgl::ExactPixelFormat); bool createContext(QEglContext *shareContext = 0, const QEglProperties *properties = 0); + void destroyContext(); EGLSurface createSurface(QPaintDevice *device, const QEglProperties *properties = 0); void destroySurface(EGLSurface surface); - void destroy(); - bool makeCurrent(EGLSurface surface); bool doneCurrent(); bool lazyDoneCurrent(); @@ -108,7 +106,7 @@ public: static EGLint error() { return eglGetError(); } static QString errorString(EGLint code); - EGLDisplay display() const { return dpy; } + static EGLDisplay display(); EGLContext context() const { return ctx; } void setContext(EGLContext context) { ctx = context; ownsContext = false;} @@ -118,8 +116,6 @@ public: QEglProperties configProperties(EGLConfig cfg = 0) const; - static EGLDisplay defaultDisplay(QPaintDevice *device); - void dumpAllConfigs(); static QString extensions(); @@ -127,7 +123,6 @@ public: private: QEgl::API apiType; - EGLDisplay dpy; EGLContext ctx; EGLConfig cfg; EGLSurface currentSurface; @@ -135,7 +130,8 @@ private: bool ownsContext; bool sharing; - static EGLDisplay getDisplay(QPaintDevice *device); + static EGLDisplay dpy; + static EGLNativeDisplayType nativeDisplay(); static QEglContext *currentContext(QEgl::API api); static void setCurrentContext(QEgl::API api, QEglContext *context); diff --git a/src/gui/egl/qegl_qws.cpp b/src/gui/egl/qegl_qws.cpp index e999e0b..2a61beb 100644 --- a/src/gui/egl/qegl_qws.cpp +++ b/src/gui/egl/qegl_qws.cpp @@ -64,12 +64,6 @@ EGLSurface QEglContext::createSurface(QPaintDevice *device, const QEglProperties return EGL_NO_SURFACE; } -EGLDisplay QEglContext::getDisplay(QPaintDevice *device) -{ - Q_UNUSED(device); - return eglGetDisplay(EGLNativeDisplayType(EGL_DEFAULT_DISPLAY)); -} - static QScreen *screenForDevice(QPaintDevice *device) { QScreen *screen = qt_screen; diff --git a/src/gui/egl/qegl_symbian.cpp b/src/gui/egl/qegl_symbian.cpp index 44ecd19..5a010cd 100644 --- a/src/gui/egl/qegl_symbian.cpp +++ b/src/gui/egl/qegl_symbian.cpp @@ -78,22 +78,14 @@ EGLSurface QEglContext::createSurface(QPaintDevice *device, const QEglProperties props = 0; EGLSurface surf; if (devType == QInternal::Widget) - surf = eglCreateWindowSurface(dpy, cfg, windowDrawable, 0); + surf = eglCreateWindowSurface(dpy, cfg, windowDrawable, props); else - surf = eglCreatePixmapSurface(dpy, cfg, pixmapDrawable, 0); + surf = eglCreatePixmapSurface(dpy, cfg, pixmapDrawable, props); if (surf == EGL_NO_SURFACE) qWarning("QEglContext::createSurface(): Unable to create EGL surface, error = 0x%x", eglGetError()); return surf; } -EGLDisplay QEglContext::getDisplay(QPaintDevice *device) -{ - EGLDisplay dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); - if (dpy == EGL_NO_DISPLAY) - qWarning("QEglContext::defaultDisplay(): Falling back to EGL_DEFAULT_DISPLAY"); - return dpy; -} - // Set pixel format and other properties based on a paint device. void QEglProperties::setPaintDeviceFormat(QPaintDevice *dev) { diff --git a/src/gui/egl/qegl_wince.cpp b/src/gui/egl/qegl_wince.cpp index 026a7b1..c9c9773 100644 --- a/src/gui/egl/qegl_wince.cpp +++ b/src/gui/egl/qegl_wince.cpp @@ -87,20 +87,15 @@ EGLSurface QEglContext::createSurface(QPaintDevice *device, const QEglProperties return surf; } -EGLDisplay QEglContext::getDisplay(QPaintDevice *device) +EGLNativeDisplayType QEglContext::nativeDisplay() { - EGLDisplay dpy = 0; HWND win = (static_cast<QWidget*>(device))->winId(); HDC myDc = GetDC(win); if (!myDc) { - qWarning("QEglContext::defaultDisplay(): WinCE display is not open"); + qWarning("QEglContext::nativeDisplay(): WinCE display is not open"); + return EGL_DEFAULT_DISPLAY; } - dpy = eglGetDisplay(EGLNativeDisplayType(myDc)); - if (dpy == EGL_NO_DISPLAY) { - qWarning("QEglContext::defaultDisplay(): Falling back to EGL_DEFAULT_DISPLAY"); - dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY); - } - return dpy; + return EGLNativeDisplayType(myDc); } // Set pixel format and other properties based on a paint device. diff --git a/src/gui/egl/qegl_x11.cpp b/src/gui/egl/qegl_x11.cpp index 2cf4e33..634ff13 100644 --- a/src/gui/egl/qegl_x11.cpp +++ b/src/gui/egl/qegl_x11.cpp @@ -93,15 +93,14 @@ EGLSurface QEglContext::createSurface(QPaintDevice *device, const QEglProperties return surf; } -EGLDisplay QEglContext::getDisplay(QPaintDevice *device) +EGLNativeDisplayType QEglContext::nativeDisplay() { - Q_UNUSED(device); Display *xdpy = QX11Info::display(); if (!xdpy) { qWarning("QEglContext::getDisplay(): X11 display is not open"); - return EGL_NO_DISPLAY; + return EGLNativeDisplayType(EGL_DEFAULT_DISPLAY); } - return eglGetDisplay(EGLNativeDisplayType(xdpy)); + return EGLNativeDisplayType(xdpy); } static int countBits(unsigned long mask) diff --git a/src/gui/egl/qeglproperties.cpp b/src/gui/egl/qeglproperties.cpp index 2915fb9..236ec37 100644 --- a/src/gui/egl/qeglproperties.cpp +++ b/src/gui/egl/qeglproperties.cpp @@ -60,7 +60,7 @@ QEglProperties::QEglProperties(EGLConfig cfg) props.append(EGL_NONE); for (int name = 0x3020; name <= 0x304F; ++name) { EGLint value; - if (name != EGL_NONE && eglGetConfigAttrib(QEglContext::defaultDisplay(0), cfg, name, &value)) + if (name != EGL_NONE && eglGetConfigAttrib(QEglContext::display(), cfg, name, &value)) setValue(name, value); } eglGetError(); // Clear the error state. @@ -273,12 +273,12 @@ static void addTag(QString& str, const QString& tag) void QEglProperties::dumpAllConfigs() { EGLint count = 0; - eglGetConfigs(QEglContext::defaultDisplay(0), 0, 0, &count); + eglGetConfigs(QEglContext::display(), 0, 0, &count); if (count < 1) return; EGLConfig *configs = new EGLConfig [count]; - eglGetConfigs(QEglContext::defaultDisplay(0), configs, count, &count); + eglGetConfigs(QEglContext::display(), configs, count, &count); for (EGLint index = 0; index < count; ++index) qWarning() << QEglProperties(configs[index]).toString(); delete [] configs; diff --git a/src/gui/graphicsview/qgraphicsitem.cpp b/src/gui/graphicsview/qgraphicsitem.cpp index 54914b3..ca20101 100644 --- a/src/gui/graphicsview/qgraphicsitem.cpp +++ b/src/gui/graphicsview/qgraphicsitem.cpp @@ -357,19 +357,22 @@ default, child items are stacked on top of the parent item. But setting this flag, the child will be stacked behind it. This flag is useful for drop shadow effects and for decoration objects that follow the parent - item's geometry without drawing on top of it. + item's geometry without drawing on top of it. This flag was introduced + in Qt 4.5. \value ItemUsesExtendedStyleOption The item makes use of either - \l{QStyleOptionGraphicsItem::}{exposedRect} or - \l{QStyleOptionGraphicsItem::}{matrix} in QStyleOptionGraphicsItem. By default, - the \l{QStyleOptionGraphicsItem::}{exposedRect} is initialized to the item's - boundingRect() and the \l{QStyleOptionGraphicsItem::}{matrix} is untransformed. - You can enable this flag for the style options to be set up with more - fine-grained values. - Note that QStyleOptionGraphicsItem::levelOfDetail is unaffected by this flag + \l{QStyleOptionGraphicsItem::} {exposedRect} or + \l{QStyleOptionGraphicsItem::} {matrix} in + QStyleOptionGraphicsItem. By default, the + \l{QStyleOptionGraphicsItem::} {exposedRect} is initialized to the + item's boundingRect() and the + \l{QStyleOptionGraphicsItem::}{matrix} is untransformed. You can + enable this flag for the style options to be set up with more + fine-grained values. Note that + QStyleOptionGraphicsItem::levelOfDetail is unaffected by this flag and always initialized to 1. Use - QStyleOptionGraphicsItem::levelOfDetailFromTransform() if you need a higher - value. + QStyleOptionGraphicsItem::levelOfDetailFromTransform() if you need + a higher value. This flag was introduced in Qt 4.6. \value ItemHasNoContents The item does not paint anything (i.e., calling paint() on the item has no effect). You should set this flag on items that @@ -387,9 +390,10 @@ used for Asian languages. This flag was introduced in Qt 4.6. - \value ItemNegativeZStacksBehindParent The item automatically stacks behind - it's parent if it's z-value is negative. This flag enables setZValue() to - toggle ItemStacksBehindParent. + \value ItemNegativeZStacksBehindParent The item automatically + stacks behind it's parent if it's z-value is negative. This flag + enables setZValue() to toggle ItemStacksBehindParent. This flag + was introduced in Qt 4.6. \value ItemIsPanel The item is a panel. A panel provides activation and contained focus handling. Only one panel can be active at a time (see diff --git a/src/gui/graphicsview/qgraphicsscene.cpp b/src/gui/graphicsview/qgraphicsscene.cpp index 3280e86..aaae88e 100644 --- a/src/gui/graphicsview/qgraphicsscene.cpp +++ b/src/gui/graphicsview/qgraphicsscene.cpp @@ -5134,6 +5134,8 @@ void QGraphicsScenePrivate::processDirtyItemsRecursive(QGraphicsItem *item, bool } /*! + \obsolete + Paints the given \a items using the provided \a painter, after the background has been drawn, and before the foreground has been drawn. All painting is done in \e scene coordinates. Before @@ -5156,7 +5158,7 @@ void QGraphicsScenePrivate::processDirtyItemsRecursive(QGraphicsItem *item, bool \snippet doc/src/snippets/graphicssceneadditemsnippet.cpp 0 - \obsolete Since Qt 4.6, this function is not called anymore unless + Since Qt 4.6, this function is not called anymore unless the QGraphicsView::IndirectPainting flag is given as an Optimization flag. @@ -5712,8 +5714,15 @@ void QGraphicsScenePrivate::touchEventHandler(QTouchEvent *sceneTouchEvent) item->d_ptr->acceptedTouchBeginEvent = true; bool res = sendTouchBeginEvent(item, &touchEvent) && touchEvent.isAccepted(); - if (!res) + if (!res) { + // forget about these touch points, we didn't handle them + for (int i = 0; i < touchEvent.touchPoints().count(); ++i) { + const QTouchEvent::TouchPoint &touchPoint = touchEvent.touchPoints().at(i); + itemForTouchPointId.remove(touchPoint.id()); + sceneCurrentTouchPoints.remove(touchPoint.id()); + } ignoreSceneTouchEvent = false; + } break; } default: @@ -5904,13 +5913,21 @@ void QGraphicsScenePrivate::getGestureTargets(const QSet<QGesture *> &gestures, QList<QGraphicsItem *> items = itemsAtPosition(screenPos, QPointF(), viewport); QList<QGraphicsObject *> result; for (int j = 0; j < items.size(); ++j) { - QGraphicsObject *item = items.at(j)->toGraphicsObject(); - if (!item) - continue; - QGraphicsItemPrivate *d = item->QGraphicsItem::d_func(); - if (d->gestureContext.contains(gestureType)) { - result.append(item); + QGraphicsItem *item = items.at(j); + + // Check if the item is blocked by a modal panel and use it as + // a target instead of this item. + (void) item->isBlockedByModalPanel(&item); + + if (QGraphicsObject *itemobj = item->toGraphicsObject()) { + QGraphicsItemPrivate *d = item->d_func(); + if (d->gestureContext.contains(gestureType)) { + result.append(itemobj); + } } + // Don't propagate through panels. + if (item->isPanel()) + break; } DEBUG() << "QGraphicsScenePrivate::getGestureTargets:" << gesture << result; diff --git a/src/gui/graphicsview/qgraphicsview.cpp b/src/gui/graphicsview/qgraphicsview.cpp index 96b9373..06b7438 100644 --- a/src/gui/graphicsview/qgraphicsview.cpp +++ b/src/gui/graphicsview/qgraphicsview.cpp @@ -3609,6 +3609,8 @@ void QGraphicsView::drawForeground(QPainter *painter, const QRectF &rect) } /*! + \obsolete + Draws the items \a items in the scene using \a painter, after the background and before the foreground are drawn. \a numItems is the number of items in \a items and options in \a options. \a options is a list of @@ -3617,7 +3619,7 @@ void QGraphicsView::drawForeground(QPainter *painter, const QRectF &rect) The default implementation calls the scene's drawItems() function. - \obsolete Since Qt 4.6, this function is not called anymore unless + Since Qt 4.6, this function is not called anymore unless the QGraphicsView::IndirectPainting flag is given as an Optimization flag. diff --git a/src/gui/gui.pro b/src/gui/gui.pro index 8ad3bac..d46f3b4 100644 --- a/src/gui/gui.pro +++ b/src/gui/gui.pro @@ -51,8 +51,27 @@ contains(DEFINES,QT_EVAL):include($$QT_SOURCE_TREE/src/corelib/eval.pri) QMAKE_DYNAMIC_LIST_FILE = $$PWD/QtGui.dynlist DEFINES += Q_INTERNAL_QAPP_SRC -symbian:TARGET.UID3=0x2001B2DD +symbian: { + TARGET.UID3=0x2001B2DD + + # ro-section in gui can exceed default allocated space, so move rw-section a little further + QMAKE_LFLAGS.ARMCC += --rw-base 0x800000 + QMAKE_LFLAGS.GCCE += -Tdata 0xC00000 + + # Partial upgrade SIS file + vendorinfo = \ + "&EN" \ + "; Localised Vendor name" \ + "%{\"Nokia, Qt\"}" \ + " " \ + "; Unique Vendor name" \ + ":\"Nokia, Qt\"" \ + " " + pu_header = "; Partial upgrade package for testing QtGui changes without reinstalling everything" \ + "$${LITERAL_HASH}{\"Qt gui\"}, (0x2001E61C), $${QT_MAJOR_VERSION},$${QT_MINOR_VERSION},$${QT_PATCH_VERSION}, TYPE=PU" + partial_upgrade.pkg_prerules = pu_header vendorinfo + partial_upgrade.sources = qtgui.dll + partial_upgrade.path = c:/sys/bin + DEPLOYMENT = partial_upgrade $$DEPLOYMENT +} -# ro-section in gui can exceed default allocated space, so more rw-section little further -symbian-sbsv2: QMAKE_LFLAGS.ARMCC += --rw-base 0x800000 -symbian: QMAKE_LFLAGS.GCCE += -Tdata 0xC00000 diff --git a/src/gui/image/qimagepixmapcleanuphooks.cpp b/src/gui/image/qimagepixmapcleanuphooks.cpp index ace4bb6..517fcb0 100644 --- a/src/gui/image/qimagepixmapcleanuphooks.cpp +++ b/src/gui/image/qimagepixmapcleanuphooks.cpp @@ -122,19 +122,32 @@ void QImagePixmapCleanupHooks::executeImageHooks(qint64 key) qt_image_cleanup_hook_64(key); } -void QImagePixmapCleanupHooks::enableCleanupHooks(const QPixmap &pixmap) -{ - enableCleanupHooks(const_cast<QPixmap &>(pixmap).data_ptr().data()); -} void QImagePixmapCleanupHooks::enableCleanupHooks(QPixmapData *pixmapData) { pixmapData->is_cached = true; } +void QImagePixmapCleanupHooks::enableCleanupHooks(const QPixmap &pixmap) +{ + enableCleanupHooks(const_cast<QPixmap &>(pixmap).data_ptr().data()); +} + void QImagePixmapCleanupHooks::enableCleanupHooks(const QImage &image) { const_cast<QImage &>(image).data_ptr()->is_cached = true; } +bool QImagePixmapCleanupHooks::isImageCached(const QImage &image) +{ + return const_cast<QImage &>(image).data_ptr()->is_cached; +} + +bool QImagePixmapCleanupHooks::isPixmapCached(const QPixmap &pixmap) +{ + return const_cast<QPixmap&>(pixmap).data_ptr().data()->is_cached; +} + + + QT_END_NAMESPACE diff --git a/src/gui/image/qimagepixmapcleanuphooks_p.h b/src/gui/image/qimagepixmapcleanuphooks_p.h index 88dd3a6..eae11f4 100644 --- a/src/gui/image/qimagepixmapcleanuphooks_p.h +++ b/src/gui/image/qimagepixmapcleanuphooks_p.h @@ -72,6 +72,9 @@ public: static void enableCleanupHooks(const QPixmap &pixmap); static void enableCleanupHooks(QPixmapData *pixmapData); + static bool isImageCached(const QImage &image); + static bool isPixmapCached(const QPixmap &pixmap); + // Gets called when a pixmap data is about to be modified: void addPixmapDataModificationHook(_qt_pixmap_cleanup_hook_pmd); diff --git a/src/gui/image/qpixmap.cpp b/src/gui/image/qpixmap.cpp index 7cafbd0..ae62f06 100644 --- a/src/gui/image/qpixmap.cpp +++ b/src/gui/image/qpixmap.cpp @@ -1690,10 +1690,9 @@ QPixmap QPixmap::transformed(const QMatrix &matrix, Qt::TransformationMode mode) \o The hasAlphaChannel() returns true if the pixmap has a format that - respects the alpha channel, otherwise returns false, while the - hasAlpha() function returns true if the pixmap has an alpha - channel \e or a mask (otherwise false). The mask() function returns - the mask as a QBitmap object, which can be set using setMask(). + respects the alpha channel, otherwise returns false. The hasAlpha(), + setMask() and mask() functions are legacy and should not be used. + They are potentially very slow. The createHeuristicMask() function creates and returns a 1-bpp heuristic mask (i.e. a QBitmap) for this pixmap. It works by @@ -1780,6 +1779,8 @@ QPixmap QPixmap::transformed(const QMatrix &matrix, Qt::TransformationMode mode) Returns true if this pixmap has an alpha channel, \e or has a mask, otherwise returns false. + \warning This is potentially an expensive operation. + \sa hasAlphaChannel(), mask() */ bool QPixmap::hasAlpha() const diff --git a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp index 2b91711..1ac8ace 100644 --- a/src/gui/inputmethod/qcoefepinputcontext_s60.cpp +++ b/src/gui/inputmethod/qcoefepinputcontext_s60.cpp @@ -113,7 +113,7 @@ void QCoeFepInputContext::update() updateHints(false); // For pre-5.0 SDKs, we don't do text updates on S60 side. - if (QSysInfo::s60Version() != QSysInfo::SV_S60_5_0) { + if (QSysInfo::s60Version() < QSysInfo::SV_S60_5_0) { return; } @@ -740,6 +740,9 @@ void QCoeFepInputContext::GetScreenCoordinatesForFepL(TPoint& aLeftSideOfBaseLin void QCoeFepInputContext::DoCommitFepInlineEditL() { commitCurrentString(false); + if (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0) + ReportAknEdStateEvent(QT_EAknCursorPositionChanged); + } void QCoeFepInputContext::commitCurrentString(bool cancelFepTransaction) diff --git a/src/gui/itemviews/qabstractitemview.cpp b/src/gui/itemviews/qabstractitemview.cpp index cbd9a8a..adf3ce3 100644 --- a/src/gui/itemviews/qabstractitemview.cpp +++ b/src/gui/itemviews/qabstractitemview.cpp @@ -1540,6 +1540,11 @@ bool QAbstractItemView::event(QEvent *event) case QEvent::FontChange: d->doDelayedItemsLayout(); // the size of the items will change break; +#ifdef QT_SOFTKEYS_ENABLED + case QEvent::LanguageChange: + d->doneSoftKey->setText(QSoftKeyManager::standardSoftKeyText(QSoftKeyManager::DoneSoftKey)); + break; +#endif default: break; } diff --git a/src/gui/itemviews/qtreeview.cpp b/src/gui/itemviews/qtreeview.cpp index d0fa22d..706d2a8 100644 --- a/src/gui/itemviews/qtreeview.cpp +++ b/src/gui/itemviews/qtreeview.cpp @@ -2474,10 +2474,11 @@ void QTreeView::rowsInserted(const QModelIndex &parent, int start, int end) QVector<QTreeViewItem> insertedItems(delta); for (int i = 0; i < delta; ++i) { - insertedItems[i].index = d->model->index(i + start, 0, parent); - insertedItems[i].level = childLevel; - insertedItems[i].hasChildren = d->hasVisibleChildren(insertedItems[i].index); - insertedItems[i].hasMoreSiblings = !((i == delta - 1) && (parentRowCount == end +1)); + QTreeViewItem &item = insertedItems[i]; + item.index = d->model->index(i + start, 0, parent); + item.level = childLevel; + item.hasChildren = d->hasVisibleChildren(item.index); + item.hasMoreSiblings = !((i == delta - 1) && (parentRowCount == end +1)); } if (d->viewItems.isEmpty()) d->defaultItemHeight = indexRowSizeHint(insertedItems[0].index); diff --git a/src/gui/kernel/qeventdispatcher_mac.mm b/src/gui/kernel/qeventdispatcher_mac.mm index 8a67dee..99b77d0 100644 --- a/src/gui/kernel/qeventdispatcher_mac.mm +++ b/src/gui/kernel/qeventdispatcher_mac.mm @@ -497,6 +497,14 @@ static bool IsMouseOrKeyEvent( NSEvent* event ) case NSOtherMouseDown: case NSOtherMouseUp: case NSOtherMouseDragged: +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 + case NSEventTypeGesture: // touch events + case NSEventTypeMagnify: + case NSEventTypeSwipe: + case NSEventTypeRotate: + case NSEventTypeBeginGesture: + case NSEventTypeEndGesture: +#endif result = true; break; diff --git a/src/gui/kernel/qsoftkeymanager.cpp b/src/gui/kernel/qsoftkeymanager.cpp index 6d108b0..c9a94ee 100644 --- a/src/gui/kernel/qsoftkeymanager.cpp +++ b/src/gui/kernel/qsoftkeymanager.cpp @@ -55,24 +55,24 @@ QT_BEGIN_NAMESPACE QSoftKeyManager *QSoftKeyManagerPrivate::self = 0; -const char *QSoftKeyManager::standardSoftKeyText(StandardSoftKey standardKey) +QString QSoftKeyManager::standardSoftKeyText(StandardSoftKey standardKey) { - const char *softKeyText = 0; + QString softKeyText; switch (standardKey) { case OkSoftKey: - softKeyText = QT_TRANSLATE_NOOP("QSoftKeyManager", "Ok"); + softKeyText = QSoftKeyManager::tr("Ok"); break; case SelectSoftKey: - softKeyText = QT_TRANSLATE_NOOP("QSoftKeyManager", "Select"); + softKeyText = QSoftKeyManager::tr("Select"); break; case DoneSoftKey: - softKeyText = QT_TRANSLATE_NOOP("QSoftKeyManager", "Done"); + softKeyText = QSoftKeyManager::tr("Done"); break; case MenuSoftKey: - softKeyText = QT_TRANSLATE_NOOP("QSoftKeyManager", "Options"); + softKeyText = QSoftKeyManager::tr("Options"); break; case CancelSoftKey: - softKeyText = QT_TRANSLATE_NOOP("QSoftKeyManager", "Cancel"); + softKeyText = QSoftKeyManager::tr("Cancel"); break; default: break; @@ -100,8 +100,7 @@ QSoftKeyManager::QSoftKeyManager() : QAction *QSoftKeyManager::createAction(StandardSoftKey standardKey, QWidget *actionWidget) { - const char* text = standardSoftKeyText(standardKey); - QAction *action = new QAction(QSoftKeyManager::tr(text), actionWidget); + QAction *action = new QAction(standardSoftKeyText(standardKey), actionWidget); QAction::SoftKeyRole softKeyRole = QAction::NoSoftKey; switch (standardKey) { case MenuSoftKey: // FALL-THROUGH @@ -211,13 +210,11 @@ bool QSoftKeyManager::handleUpdateSoftKeys() d->requestedSoftKeyActions.clear(); bool recursiveMerging = false; QWidget *source = softkeySource(NULL, recursiveMerging); - do { - if (source) { - bool added = appendSoftkeys(*source, level); - source = softkeySource(source, recursiveMerging); - level = added ? ++level : level; - } - } while (source); + while (source) { + if (appendSoftkeys(*source, level)) + ++level; + source = softkeySource(source, recursiveMerging); + } d->updateSoftKeys_sys(); return true; diff --git a/src/gui/kernel/qsoftkeymanager_p.h b/src/gui/kernel/qsoftkeymanager_p.h index ce902fe..a6fe17e 100644 --- a/src/gui/kernel/qsoftkeymanager_p.h +++ b/src/gui/kernel/qsoftkeymanager_p.h @@ -87,6 +87,7 @@ public: static QAction *createAction(StandardSoftKey standardKey, QWidget *actionWidget); static QAction *createKeyedAction(StandardSoftKey standardKey, Qt::Key key, QWidget *actionWidget); + static QString standardSoftKeyText(StandardSoftKey standardKey); protected: bool event(QEvent *e); @@ -94,7 +95,6 @@ protected: private: QSoftKeyManager(); static QSoftKeyManager *instance(); - static const char *standardSoftKeyText(StandardSoftKey standardKey); bool appendSoftkeys(const QWidget &source, int level); QWidget *softkeySource(QWidget *previousSource, bool& recursiveMerging); bool handleUpdateSoftKeys(); diff --git a/src/gui/painting/qcups.cpp b/src/gui/painting/qcups.cpp index 7903762..ac41692 100644 --- a/src/gui/painting/qcups.cpp +++ b/src/gui/painting/qcups.cpp @@ -342,7 +342,9 @@ bool QCUPSSupport::printerHasPPD(const char *printerName) { if (!isAvailable()) return false; - return _cupsGetPPD(printerName) != 0; + const char *ppdFile = _cupsGetPPD(printerName); + unlink(ppdFile); + return (ppdFile != 0); } QString QCUPSSupport::unicodeString(const char *s) diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index 7a3da20..070491d 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -8092,20 +8092,43 @@ void qInitDrawhelperAsm() qDrawHelper[QImage::Format_ARGB32_Premultiplied].blendColor = qt_blend_color_argb_sse3dnow; } #endif // 3DNOW - extern void qt_blend_rgb32_on_rgb32_sse(uchar *destPixels, int dbpl, - const uchar *srcPixels, int sbpl, - int w, int h, - int const_alpha); - extern void qt_blend_argb32_on_argb32_sse(uchar *destPixels, int dbpl, - const uchar *srcPixels, int sbpl, - int w, int h, - int const_alpha); - qBlendFunctions[QImage::Format_RGB32][QImage::Format_RGB32] = qt_blend_rgb32_on_rgb32_sse; - qBlendFunctions[QImage::Format_ARGB32_Premultiplied][QImage::Format_RGB32] = qt_blend_rgb32_on_rgb32_sse; - qBlendFunctions[QImage::Format_RGB32][QImage::Format_ARGB32_Premultiplied] = qt_blend_argb32_on_argb32_sse; - qBlendFunctions[QImage::Format_ARGB32_Premultiplied][QImage::Format_ARGB32_Premultiplied] = qt_blend_argb32_on_argb32_sse; - } + +#ifdef QT_HAVE_SSE2 + if (features & SSE2) { + extern void qt_blend_rgb32_on_rgb32_sse2(uchar *destPixels, int dbpl, + const uchar *srcPixels, int sbpl, + int w, int h, + int const_alpha); + extern void qt_blend_argb32_on_argb32_sse2(uchar *destPixels, int dbpl, + const uchar *srcPixels, int sbpl, + int w, int h, + int const_alpha); + + + qBlendFunctions[QImage::Format_RGB32][QImage::Format_RGB32] = qt_blend_rgb32_on_rgb32_sse2; + qBlendFunctions[QImage::Format_ARGB32_Premultiplied][QImage::Format_RGB32] = qt_blend_rgb32_on_rgb32_sse2; + qBlendFunctions[QImage::Format_RGB32][QImage::Format_ARGB32_Premultiplied] = qt_blend_argb32_on_argb32_sse2; + qBlendFunctions[QImage::Format_ARGB32_Premultiplied][QImage::Format_ARGB32_Premultiplied] = qt_blend_argb32_on_argb32_sse2; + } else +#endif + { + extern void qt_blend_rgb32_on_rgb32_sse(uchar *destPixels, int dbpl, + const uchar *srcPixels, int sbpl, + int w, int h, + int const_alpha); + extern void qt_blend_argb32_on_argb32_sse(uchar *destPixels, int dbpl, + const uchar *srcPixels, int sbpl, + int w, int h, + int const_alpha); + + + qBlendFunctions[QImage::Format_RGB32][QImage::Format_RGB32] = qt_blend_rgb32_on_rgb32_sse; + qBlendFunctions[QImage::Format_ARGB32_Premultiplied][QImage::Format_RGB32] = qt_blend_rgb32_on_rgb32_sse; + qBlendFunctions[QImage::Format_RGB32][QImage::Format_ARGB32_Premultiplied] = qt_blend_argb32_on_argb32_sse; + qBlendFunctions[QImage::Format_ARGB32_Premultiplied][QImage::Format_ARGB32_Premultiplied] = qt_blend_argb32_on_argb32_sse; + } +} #endif // SSE #ifdef QT_HAVE_IWMMXT diff --git a/src/gui/painting/qdrawhelper_neon.cpp b/src/gui/painting/qdrawhelper_neon.cpp index 25860a0..77c5202 100644 --- a/src/gui/painting/qdrawhelper_neon.cpp +++ b/src/gui/painting/qdrawhelper_neon.cpp @@ -48,43 +48,43 @@ QT_BEGIN_NAMESPACE -static inline int16x8_t qvdiv_255_s16(int16x8_t x, int16x8_t half) +static inline uint16x8_t qvdiv_255_u16(uint16x8_t x, uint16x8_t half) { // result = (x + (x >> 8) + 0x80) >> 8 - const int16x8_t temp = vshrq_n_s16(x, 8); // x >> 8 - const int16x8_t sum_part = vaddq_s16(x, half); // x + 0x80 - const int16x8_t sum = vaddq_s16(temp, sum_part); + const uint16x8_t temp = vshrq_n_u16(x, 8); // x >> 8 + const uint16x8_t sum_part = vaddq_u16(x, half); // x + 0x80 + const uint16x8_t sum = vaddq_u16(temp, sum_part); - return vreinterpretq_s16_u16(vshrq_n_u16(vreinterpretq_u16_s16(sum), 8)); + return vshrq_n_u16(sum, 8); } -static inline int16x8_t qvbyte_mul_s16(int16x8_t x, int16x8_t alpha, int16x8_t half) +static inline uint16x8_t qvbyte_mul_u16(uint16x8_t x, uint16x8_t alpha, uint16x8_t half) { // t = qRound(x * alpha / 255.0) - const int16x8_t t = vmulq_s16(x, alpha); // t - return qvdiv_255_s16(t, half); + const uint16x8_t t = vmulq_u16(x, alpha); // t + return qvdiv_255_u16(t, half); } -static inline int16x8_t qvinterpolate_pixel_255(int16x8_t x, int16x8_t a, int16x8_t y, int16x8_t b, int16x8_t half) +static inline uint16x8_t qvinterpolate_pixel_255(uint16x8_t x, uint16x8_t a, uint16x8_t y, uint16x8_t b, uint16x8_t half) { // t = x * a + y * b - const int16x8_t ta = vmulq_s16(x, a); - const int16x8_t tb = vmulq_s16(y, b); + const uint16x8_t ta = vmulq_u16(x, a); + const uint16x8_t tb = vmulq_u16(y, b); - return qvdiv_255_s16(vaddq_s16(ta, tb), half); + return qvdiv_255_u16(vaddq_u16(ta, tb), half); } -static inline int16x8_t qvsource_over_s16(int16x8_t src16, int16x8_t dst16, int16x8_t half, int16x8_t full) +static inline uint16x8_t qvsource_over_u16(uint16x8_t src16, uint16x8_t dst16, uint16x8_t half, uint16x8_t full) { - const int16x4_t alpha16_high = vdup_lane_s16(vget_high_s16(src16), 3); - const int16x4_t alpha16_low = vdup_lane_s16(vget_low_s16(src16), 3); + const uint16x4_t alpha16_high = vdup_lane_u16(vget_high_u16(src16), 3); + const uint16x4_t alpha16_low = vdup_lane_u16(vget_low_u16(src16), 3); - const int16x8_t alpha16 = vsubq_s16(full, vcombine_s16(alpha16_low, alpha16_high)); + const uint16x8_t alpha16 = vsubq_u16(full, vcombine_u16(alpha16_low, alpha16_high)); - return vaddq_s16(src16, qvbyte_mul_s16(dst16, alpha16, half)); + return vaddq_u16(src16, qvbyte_mul_u16(dst16, alpha16, half)); } void qt_blend_argb32_on_argb32_neon(uchar *destPixels, int dbpl, @@ -94,21 +94,21 @@ void qt_blend_argb32_on_argb32_neon(uchar *destPixels, int dbpl, { const uint *src = (const uint *) srcPixels; uint *dst = (uint *) destPixels; - int16x8_t half = vdupq_n_s16(0x80); - int16x8_t full = vdupq_n_s16(0xff); + uint16x8_t half = vdupq_n_u16(0x80); + uint16x8_t full = vdupq_n_u16(0xff); if (const_alpha == 256) { for (int y = 0; y < h; ++y) { int x = 0; for (; x < w-3; x += 4) { - int32x4_t src32 = vld1q_s32((int32_t *)&src[x]); + uint32x4_t src32 = vld1q_u32((uint32_t *)&src[x]); if ((src[x] & src[x+1] & src[x+2] & src[x+3]) >= 0xff000000) { // all opaque - vst1q_s32((int32_t *)&dst[x], src32); + vst1q_u32((uint32_t *)&dst[x], src32); } else if (src[x] | src[x+1] | src[x+2] | src[x+3]) { - int32x4_t dst32 = vld1q_s32((int32_t *)&dst[x]); + uint32x4_t dst32 = vld1q_u32((uint32_t *)&dst[x]); - const uint8x16_t src8 = vreinterpretq_u8_s32(src32); - const uint8x16_t dst8 = vreinterpretq_u8_s32(dst32); + const uint8x16_t src8 = vreinterpretq_u8_u32(src32); + const uint8x16_t dst8 = vreinterpretq_u8_u32(dst32); const uint8x8_t src8_low = vget_low_u8(src8); const uint8x8_t dst8_low = vget_low_u8(dst8); @@ -116,19 +116,19 @@ void qt_blend_argb32_on_argb32_neon(uchar *destPixels, int dbpl, const uint8x8_t src8_high = vget_high_u8(src8); const uint8x8_t dst8_high = vget_high_u8(dst8); - const int16x8_t src16_low = vreinterpretq_s16_u16(vmovl_u8(src8_low)); - const int16x8_t dst16_low = vreinterpretq_s16_u16(vmovl_u8(dst8_low)); + const uint16x8_t src16_low = vmovl_u8(src8_low); + const uint16x8_t dst16_low = vmovl_u8(dst8_low); - const int16x8_t src16_high = vreinterpretq_s16_u16(vmovl_u8(src8_high)); - const int16x8_t dst16_high = vreinterpretq_s16_u16(vmovl_u8(dst8_high)); + const uint16x8_t src16_high = vmovl_u8(src8_high); + const uint16x8_t dst16_high = vmovl_u8(dst8_high); - const int16x8_t result16_low = qvsource_over_s16(src16_low, dst16_low, half, full); - const int16x8_t result16_high = qvsource_over_s16(src16_high, dst16_high, half, full); + const uint16x8_t result16_low = qvsource_over_u16(src16_low, dst16_low, half, full); + const uint16x8_t result16_high = qvsource_over_u16(src16_high, dst16_high, half, full); - const int32x2_t result32_low = vreinterpret_s32_s8(vmovn_s16(result16_low)); - const int32x2_t result32_high = vreinterpret_s32_s8(vmovn_s16(result16_high)); + const uint32x2_t result32_low = vreinterpret_u32_u8(vmovn_u16(result16_low)); + const uint32x2_t result32_high = vreinterpret_u32_u8(vmovn_u16(result16_high)); - vst1q_s32((int32_t *)&dst[x], vcombine_s32(result32_low, result32_high)); + vst1q_u32((uint32_t *)&dst[x], vcombine_u32(result32_low, result32_high)); } } for (; x<w; ++x) { @@ -143,16 +143,16 @@ void qt_blend_argb32_on_argb32_neon(uchar *destPixels, int dbpl, } } else if (const_alpha != 0) { const_alpha = (const_alpha * 255) >> 8; - int16x8_t const_alpha16 = vdupq_n_s16(const_alpha); + uint16x8_t const_alpha16 = vdupq_n_u16(const_alpha); for (int y = 0; y < h; ++y) { int x = 0; for (; x < w-3; x += 4) { if (src[x] | src[x+1] | src[x+2] | src[x+3]) { - int32x4_t src32 = vld1q_s32((int32_t *)&src[x]); - int32x4_t dst32 = vld1q_s32((int32_t *)&dst[x]); + uint32x4_t src32 = vld1q_u32((uint32_t *)&src[x]); + uint32x4_t dst32 = vld1q_u32((uint32_t *)&dst[x]); - const uint8x16_t src8 = vreinterpretq_u8_s32(src32); - const uint8x16_t dst8 = vreinterpretq_u8_s32(dst32); + const uint8x16_t src8 = vreinterpretq_u8_u32(src32); + const uint8x16_t dst8 = vreinterpretq_u8_u32(dst32); const uint8x8_t src8_low = vget_low_u8(src8); const uint8x8_t dst8_low = vget_low_u8(dst8); @@ -160,22 +160,22 @@ void qt_blend_argb32_on_argb32_neon(uchar *destPixels, int dbpl, const uint8x8_t src8_high = vget_high_u8(src8); const uint8x8_t dst8_high = vget_high_u8(dst8); - const int16x8_t src16_low = vreinterpretq_s16_u16(vmovl_u8(src8_low)); - const int16x8_t dst16_low = vreinterpretq_s16_u16(vmovl_u8(dst8_low)); + const uint16x8_t src16_low = vmovl_u8(src8_low); + const uint16x8_t dst16_low = vmovl_u8(dst8_low); - const int16x8_t src16_high = vreinterpretq_s16_u16(vmovl_u8(src8_high)); - const int16x8_t dst16_high = vreinterpretq_s16_u16(vmovl_u8(dst8_high)); + const uint16x8_t src16_high = vmovl_u8(src8_high); + const uint16x8_t dst16_high = vmovl_u8(dst8_high); - const int16x8_t srcalpha16_low = qvbyte_mul_s16(src16_low, const_alpha16, half); - const int16x8_t srcalpha16_high = qvbyte_mul_s16(src16_high, const_alpha16, half); + const uint16x8_t srcalpha16_low = qvbyte_mul_u16(src16_low, const_alpha16, half); + const uint16x8_t srcalpha16_high = qvbyte_mul_u16(src16_high, const_alpha16, half); - const int16x8_t result16_low = qvsource_over_s16(srcalpha16_low, dst16_low, half, full); - const int16x8_t result16_high = qvsource_over_s16(srcalpha16_high, dst16_high, half, full); + const uint16x8_t result16_low = qvsource_over_u16(srcalpha16_low, dst16_low, half, full); + const uint16x8_t result16_high = qvsource_over_u16(srcalpha16_high, dst16_high, half, full); - const int32x2_t result32_low = vreinterpret_s32_s8(vmovn_s16(result16_low)); - const int32x2_t result32_high = vreinterpret_s32_s8(vmovn_s16(result16_high)); + const uint32x2_t result32_low = vreinterpret_u32_u8(vmovn_u16(result16_low)); + const uint32x2_t result32_high = vreinterpret_u32_u8(vmovn_u16(result16_high)); - vst1q_s32((int32_t *)&dst[x], vcombine_s32(result32_low, result32_high)); + vst1q_u32((uint32_t *)&dst[x], vcombine_u32(result32_low, result32_high)); } } for (; x<w; ++x) { @@ -206,19 +206,19 @@ void qt_blend_rgb32_on_rgb32_neon(uchar *destPixels, int dbpl, if (const_alpha != 0) { const uint *src = (const uint *) srcPixels; uint *dst = (uint *) destPixels; - int16x8_t half = vdupq_n_s16(0x80); + uint16x8_t half = vdupq_n_u16(0x80); const_alpha = (const_alpha * 255) >> 8; int one_minus_const_alpha = 255 - const_alpha; - int16x8_t const_alpha16 = vdupq_n_s16(const_alpha); - int16x8_t one_minus_const_alpha16 = vdupq_n_s16(255 - const_alpha); + uint16x8_t const_alpha16 = vdupq_n_u16(const_alpha); + uint16x8_t one_minus_const_alpha16 = vdupq_n_u16(255 - const_alpha); for (int y = 0; y < h; ++y) { int x = 0; for (; x < w-3; x += 4) { - int32x4_t src32 = vld1q_s32((int32_t *)&src[x]); - int32x4_t dst32 = vld1q_s32((int32_t *)&dst[x]); + uint32x4_t src32 = vld1q_u32((uint32_t *)&src[x]); + uint32x4_t dst32 = vld1q_u32((uint32_t *)&dst[x]); - const uint8x16_t src8 = vreinterpretq_u8_s32(src32); - const uint8x16_t dst8 = vreinterpretq_u8_s32(dst32); + const uint8x16_t src8 = vreinterpretq_u8_u32(src32); + const uint8x16_t dst8 = vreinterpretq_u8_u32(dst32); const uint8x8_t src8_low = vget_low_u8(src8); const uint8x8_t dst8_low = vget_low_u8(dst8); @@ -226,19 +226,19 @@ void qt_blend_rgb32_on_rgb32_neon(uchar *destPixels, int dbpl, const uint8x8_t src8_high = vget_high_u8(src8); const uint8x8_t dst8_high = vget_high_u8(dst8); - const int16x8_t src16_low = vreinterpretq_s16_u16(vmovl_u8(src8_low)); - const int16x8_t dst16_low = vreinterpretq_s16_u16(vmovl_u8(dst8_low)); + const uint16x8_t src16_low = vmovl_u8(src8_low); + const uint16x8_t dst16_low = vmovl_u8(dst8_low); - const int16x8_t src16_high = vreinterpretq_s16_u16(vmovl_u8(src8_high)); - const int16x8_t dst16_high = vreinterpretq_s16_u16(vmovl_u8(dst8_high)); + const uint16x8_t src16_high = vmovl_u8(src8_high); + const uint16x8_t dst16_high = vmovl_u8(dst8_high); - const int16x8_t result16_low = qvinterpolate_pixel_255(src16_low, const_alpha16, dst16_low, one_minus_const_alpha16, half); - const int16x8_t result16_high = qvinterpolate_pixel_255(src16_high, const_alpha16, dst16_high, one_minus_const_alpha16, half); + const uint16x8_t result16_low = qvinterpolate_pixel_255(src16_low, const_alpha16, dst16_low, one_minus_const_alpha16, half); + const uint16x8_t result16_high = qvinterpolate_pixel_255(src16_high, const_alpha16, dst16_high, one_minus_const_alpha16, half); - const int32x2_t result32_low = vreinterpret_s32_s8(vmovn_s16(result16_low)); - const int32x2_t result32_high = vreinterpret_s32_s8(vmovn_s16(result16_high)); + const uint32x2_t result32_low = vreinterpret_u32_u8(vmovn_u16(result16_low)); + const uint32x2_t result32_high = vreinterpret_u32_u8(vmovn_u16(result16_high)); - vst1q_s32((int32_t *)&dst[x], vcombine_s32(result32_low, result32_high)); + vst1q_u32((uint32_t *)&dst[x], vcombine_u32(result32_low, result32_high)); } for (; x<w; ++x) { uint s = src[x]; diff --git a/src/gui/painting/qdrawhelper_sse2.cpp b/src/gui/painting/qdrawhelper_sse2.cpp index dd6fa1b..6ac64d3 100644 --- a/src/gui/painting/qdrawhelper_sse2.cpp +++ b/src/gui/painting/qdrawhelper_sse2.cpp @@ -57,6 +57,217 @@ QT_BEGIN_NAMESPACE +/* + * Multiply the components of pixelVector by alphaChannel + * Each 32bits components of alphaChannel must be in the form 0x00AA00AA + * colorMask must have 0x00ff00ff on each 32 bits component + * half must have the value 128 (0x80) for each 32 bits compnent + */ +#define BYTE_MUL_SSE2(result, pixelVector, alphaChannel, colorMask, half) \ +{ \ + /* 1. separate the colors in 2 vectors so each color is on 16 bits \ + (in order to be multiplied by the alpha \ + each 32 bit of dstVectorAG are in the form 0x00AA00GG \ + each 32 bit of dstVectorRB are in the form 0x00RR00BB */\ + __m128i pixelVectorAG = _mm_srli_epi16(pixelVector, 8); \ + __m128i pixelVectorRB = _mm_and_si128(pixelVector, colorMask); \ + \ + /* 2. multiply the vectors by the alpha channel */\ + pixelVectorAG = _mm_mullo_epi16(pixelVectorAG, alphaChannel); \ + pixelVectorRB = _mm_mullo_epi16(pixelVectorRB, alphaChannel); \ + \ + /* 3. devide by 255, that's the tricky part. \ + we do it like for BYTE_MUL(), with bit shift: X/255 ~= (X + X/256 + rounding)/256 */ \ + /** so first (X + X/256 + rounding) */\ + pixelVectorRB = _mm_add_epi16(pixelVectorRB, _mm_srli_epi16(pixelVectorRB, 8)); \ + pixelVectorRB = _mm_add_epi16(pixelVectorRB, half); \ + pixelVectorAG = _mm_add_epi16(pixelVectorAG, _mm_srli_epi16(pixelVectorAG, 8)); \ + pixelVectorAG = _mm_add_epi16(pixelVectorAG, half); \ + \ + /** second devide by 256 */\ + pixelVectorRB = _mm_srli_epi16(pixelVectorRB, 8); \ + /** for AG, we could >> 8 to divide followed by << 8 to put the \ + bytes in the correct position. By masking instead, we execute \ + only one instruction */\ + pixelVectorAG = _mm_andnot_si128(colorMask, pixelVectorAG); \ + \ + /* 4. combine the 2 pairs of colors */ \ + result = _mm_or_si128(pixelVectorAG, pixelVectorRB); \ +} + +/* + * Each 32bits components of alphaChannel must be in the form 0x00AA00AA + * oneMinusAlphaChannel must be 255 - alpha for each 32 bits component + * colorMask must have 0x00ff00ff on each 32 bits component + * half must have the value 128 (0x80) for each 32 bits compnent + */ +#define INTERPOLATE_PIXEL_255_SSE2(result, srcVector, dstVector, alphaChannel, oneMinusAlphaChannel, colorMask, half) { \ + /* interpolate AG */\ + __m128i srcVectorAG = _mm_srli_epi16(srcVector, 8); \ + __m128i dstVectorAG = _mm_srli_epi16(dstVector, 8); \ + __m128i srcVectorAGalpha = _mm_mullo_epi16(srcVectorAG, alphaChannel); \ + __m128i dstVectorAGoneMinusAlphalpha = _mm_mullo_epi16(dstVectorAG, oneMinusAlphaChannel); \ + __m128i finalAG = _mm_add_epi16(srcVectorAGalpha, dstVectorAGoneMinusAlphalpha); \ + finalAG = _mm_add_epi16(finalAG, _mm_srli_epi16(finalAG, 8)); \ + finalAG = _mm_add_epi16(finalAG, half); \ + finalAG = _mm_andnot_si128(colorMask, finalAG); \ + \ + /* interpolate RB */\ + __m128i srcVectorRB = _mm_and_si128(srcVector, colorMask); \ + __m128i dstVectorRB = _mm_and_si128(dstVector, colorMask); \ + __m128i srcVectorRBalpha = _mm_mullo_epi16(srcVectorRB, alphaChannel); \ + __m128i dstVectorRBoneMinusAlphalpha = _mm_mullo_epi16(dstVectorRB, oneMinusAlphaChannel); \ + __m128i finalRB = _mm_add_epi16(srcVectorRBalpha, dstVectorRBoneMinusAlphalpha); \ + finalRB = _mm_add_epi16(finalRB, _mm_srli_epi16(finalRB, 8)); \ + finalRB = _mm_add_epi16(finalRB, half); \ + finalRB = _mm_srli_epi16(finalRB, 8); \ + \ + /* combine */\ + result = _mm_or_si128(finalAG, finalRB); \ +} + +void qt_blend_argb32_on_argb32_sse2(uchar *destPixels, int dbpl, + const uchar *srcPixels, int sbpl, + int w, int h, + int const_alpha) +{ + const quint32 *src = (const quint32 *) srcPixels; + quint32 *dst = (uint *) destPixels; + if (const_alpha == 256) { + const __m128i alphaMask = _mm_set1_epi32(0xff000000); + const __m128i nullVector = _mm_set1_epi32(0); + const __m128i half = _mm_set1_epi16(0x80); + const __m128i one = _mm_set1_epi16(0xff); + const __m128i colorMask = _mm_set1_epi32(0x00ff00ff); + for (int y = 0; y < h; ++y) { + int x = 0; + for (; x < w-3; x += 4) { + const __m128i srcVector = _mm_loadu_si128((__m128i *)&src[x]); + const __m128i srcVectorAlpha = _mm_and_si128(srcVector, alphaMask); + if (_mm_movemask_epi8(_mm_cmpeq_epi32(srcVectorAlpha, alphaMask)) == 0xffff) { + // all opaque + _mm_storeu_si128((__m128i *)&dst[x], srcVector); + } else if (_mm_movemask_epi8(_mm_cmpeq_epi32(srcVectorAlpha, nullVector)) != 0xffff) { + // not fully transparent + // result = s + d * (1-alpha) + + // extract the alpha channel on 2 x 16 bits + // so we have room for the multiplication + // each 32 bits will be in the form 0x00AA00AA + // with A being the 1 - alpha + __m128i alphaChannel = _mm_srli_epi32(srcVector, 24); + alphaChannel = _mm_or_si128(alphaChannel, _mm_slli_epi32(alphaChannel, 16)); + alphaChannel = _mm_sub_epi16(one, alphaChannel); + + const __m128i dstVector = _mm_loadu_si128((__m128i *)&dst[x]); + __m128i destMultipliedByOneMinusAlpha; + BYTE_MUL_SSE2(destMultipliedByOneMinusAlpha, dstVector, alphaChannel, colorMask, half); + + // result = s + d * (1-alpha) + const __m128i result = _mm_add_epi8(srcVector, destMultipliedByOneMinusAlpha); + _mm_storeu_si128((__m128i *)&dst[x], result); + } + } + for (; x<w; ++x) { + uint s = src[x]; + if (s >= 0xff000000) + dst[x] = s; + else if (s != 0) + dst[x] = s + BYTE_MUL(dst[x], qAlpha(~s)); + } + dst = (quint32 *)(((uchar *) dst) + dbpl); + src = (const quint32 *)(((const uchar *) src) + sbpl); + } + } else if (const_alpha != 0) { + // dest = (s + d * sia) * ca + d * cia + // = s * ca + d * (sia * ca + cia) + // = s * ca + d * (1 - sa*ca) + const_alpha = (const_alpha * 255) >> 8; + const __m128i nullVector = _mm_set1_epi32(0); + const __m128i half = _mm_set1_epi16(0x80); + const __m128i one = _mm_set1_epi16(0xff); + const __m128i colorMask = _mm_set1_epi32(0x00ff00ff); + const __m128i constAlphaVector = _mm_set1_epi16(const_alpha); + for (int y = 0; y < h; ++y) { + int x = 0; + for (; x < w-3; x += 4) { + __m128i srcVector = _mm_loadu_si128((__m128i *)&src[x]); + if (_mm_movemask_epi8(_mm_cmpeq_epi32(srcVector, nullVector)) != 0xffff) { + BYTE_MUL_SSE2(srcVector, srcVector, constAlphaVector, colorMask, half); + + __m128i alphaChannel = _mm_srli_epi32(srcVector, 24); + alphaChannel = _mm_or_si128(alphaChannel, _mm_slli_epi32(alphaChannel, 16)); + alphaChannel = _mm_sub_epi16(one, alphaChannel); + + const __m128i dstVector = _mm_loadu_si128((__m128i *)&dst[x]); + __m128i destMultipliedByOneMinusAlpha; + BYTE_MUL_SSE2(destMultipliedByOneMinusAlpha, dstVector, alphaChannel, colorMask, half); + + const __m128i result = _mm_add_epi8(srcVector, destMultipliedByOneMinusAlpha); + _mm_storeu_si128((__m128i *)&dst[x], result); + } + } + for (; x<w; ++x) { + quint32 s = src[x]; + if (s != 0) { + s = BYTE_MUL(s, const_alpha); + dst[x] = s + BYTE_MUL(dst[x], qAlpha(~s)); + } + } + dst = (quint32 *)(((uchar *) dst) + dbpl); + src = (const quint32 *)(((const uchar *) src) + sbpl); + } + } +} + +// qblendfunctions.cpp +void qt_blend_rgb32_on_rgb32(uchar *destPixels, int dbpl, + const uchar *srcPixels, int sbpl, + int w, int h, + int const_alpha); + +void qt_blend_rgb32_on_rgb32_sse2(uchar *destPixels, int dbpl, + const uchar *srcPixels, int sbpl, + int w, int h, + int const_alpha) +{ + const quint32 *src = (const quint32 *) srcPixels; + quint32 *dst = (uint *) destPixels; + if (const_alpha != 256) { + if (const_alpha != 0) { + const __m128i nullVector = _mm_set1_epi32(0); + const __m128i half = _mm_set1_epi16(0x80); + const __m128i colorMask = _mm_set1_epi32(0x00ff00ff); + + const_alpha = (const_alpha * 255) >> 8; + int one_minus_const_alpha = 255 - const_alpha; + const __m128i constAlphaVector = _mm_set1_epi16(const_alpha); + const __m128i oneMinusConstAlpha = _mm_set1_epi16(one_minus_const_alpha); + for (int y = 0; y < h; ++y) { + int x = 0; + for (; x < w-3; x += 4) { + __m128i srcVector = _mm_loadu_si128((__m128i *)&src[x]); + if (_mm_movemask_epi8(_mm_cmpeq_epi32(srcVector, nullVector)) != 0xffff) { + const __m128i dstVector = _mm_loadu_si128((__m128i *)&dst[x]); + __m128i result; + INTERPOLATE_PIXEL_255_SSE2(result, srcVector, dstVector, constAlphaVector, oneMinusConstAlpha, colorMask, half); + _mm_storeu_si128((__m128i *)&dst[x], result); + } + } + for (; x<w; ++x) { + quint32 s = src[x]; + s = BYTE_MUL(s, const_alpha); + dst[x] = INTERPOLATE_PIXEL_255(src[x], const_alpha, dst[x], one_minus_const_alpha); + } + dst = (quint32 *)(((uchar *) dst) + dbpl); + src = (const quint32 *)(((const uchar *) src) + sbpl); + } + } + } else { + qt_blend_rgb32_on_rgb32(destPixels, dbpl, srcPixels, sbpl, w, h, const_alpha); + } +} + void qt_memfill32_sse2(quint32 *dest, quint32 value, int count) { if (count < 7) { diff --git a/src/gui/painting/qdrawhelper_x86_p.h b/src/gui/painting/qdrawhelper_x86_p.h index 30aadd0..d7282a7 100644 --- a/src/gui/painting/qdrawhelper_x86_p.h +++ b/src/gui/painting/qdrawhelper_x86_p.h @@ -114,6 +114,14 @@ void qt_bitmapblit32_sse2(QRasterBuffer *rasterBuffer, int x, int y, void qt_bitmapblit16_sse2(QRasterBuffer *rasterBuffer, int x, int y, quint32 color, const uchar *src, int width, int height, int stride); +void qt_blend_argb32_on_argb32_sse2(uchar *destPixels, int dbpl, + const uchar *srcPixels, int sbpl, + int w, int h, + int const_alpha); +void qt_blend_rgb32_on_rgb32_sse2(uchar *destPixels, int dbpl, + const uchar *srcPixels, int sbpl, + int w, int h, + int const_alpha); #endif // QT_HAVE_SSE2 #ifdef QT_HAVE_IWMMXT diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp index 41c4f14..60265c5 100644 --- a/src/gui/painting/qpaintengine_raster.cpp +++ b/src/gui/painting/qpaintengine_raster.cpp @@ -101,10 +101,6 @@ #endif #include <limits.h> -#if defined(QT_NO_FPU) || (_MSC_VER >= 1300 && _MSC_VER < 1400) -# define FLOATING_POINT_BUGGY_OR_NO_FPU -#endif - QT_BEGIN_NAMESPACE extern bool qt_scaleForTransform(const QTransform &transform, qreal *scale); // qtransform.cpp @@ -3694,9 +3690,6 @@ void QRasterPaintEngine::drawEllipse(const QRectF &rect) if (((qpen_style(s->lastPen) == Qt::SolidLine && s->flags.fast_pen) || (qpen_style(s->lastPen) == Qt::NoPen && !s->flags.antialiased)) && qMax(rect.width(), rect.height()) < QT_RASTER_COORD_LIMIT -#ifdef FLOATING_POINT_BUGGY_OR_NO_FPU - && qMax(rect.width(), rect.height()) < 128 // integer math breakdown -#endif && s->matrix.type() <= QTransform::TxScale) // no shear { ensureBrush(); @@ -6069,15 +6062,9 @@ static void drawEllipse_midpoint_i(const QRect &rect, const QRect &clip, ProcessSpans pen_func, ProcessSpans brush_func, QSpanData *pen_data, QSpanData *brush_data) { -#ifdef FLOATING_POINT_BUGGY_OR_NO_FPU // no fpu, so use fixed point - const QFixed a = QFixed(rect.width()) >> 1; - const QFixed b = QFixed(rect.height()) >> 1; - QFixed d = b*b - (a*a*b) + ((a*a) >> 2); -#else const qreal a = qreal(rect.width()) / 2; const qreal b = qreal(rect.height()) / 2; qreal d = b*b - (a*a*b) + 0.25*a*a; -#endif int x = 0; int y = (rect.height() + 1) / 2; @@ -6100,12 +6087,7 @@ static void drawEllipse_midpoint_i(const QRect &rect, const QRect &clip, pen_func, brush_func, pen_data, brush_data); // region 2 -#ifdef FLOATING_POINT_BUGGY_OR_NO_FPU - d = b*b*(x + (QFixed(1) >> 1))*(x + (QFixed(1) >> 1)) - + a*a*((y - 1)*(y - 1) - b*b); -#else d = b*b*(x + 0.5)*(x + 0.5) + a*a*((y - 1)*(y - 1) - b*b); -#endif const int miny = rect.height() & 0x1; while (y > miny) { if (d < 0) { // select SE diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp index 1b8b718..e69512d 100644 --- a/src/gui/painting/qpainter.cpp +++ b/src/gui/painting/qpainter.cpp @@ -710,13 +710,14 @@ void QPainterPrivate::updateEmulationSpecifier(QPainterState *s) bool penTextureAlpha = false; if (penBrush.style() == Qt::TexturePattern) penTextureAlpha = qHasPixmapTexture(penBrush) - ? penBrush.texture().hasAlpha() + ? (penBrush.texture().depth() > 1) && penBrush.texture().hasAlpha() : penBrush.textureImage().hasAlphaChannel(); bool brushTextureAlpha = false; - if (s->brush.style() == Qt::TexturePattern) + if (s->brush.style() == Qt::TexturePattern) { brushTextureAlpha = qHasPixmapTexture(s->brush) - ? s->brush.texture().hasAlpha() + ? (s->brush.texture().depth() > 1) && s->brush.texture().hasAlpha() : s->brush.textureImage().hasAlphaChannel(); + } if (((penBrush.style() == Qt::TexturePattern && penTextureAlpha) || (s->brush.style() == Qt::TexturePattern && brushTextureAlpha)) && !engine->hasFeature(QPaintEngine::MaskedBrush)) diff --git a/src/gui/styles/qs60style.cpp b/src/gui/styles/qs60style.cpp index ea7399f..565cc2c 100644 --- a/src/gui/styles/qs60style.cpp +++ b/src/gui/styles/qs60style.cpp @@ -120,6 +120,8 @@ QPixmap *QS60StylePrivate::m_background = 0; // theme palette QPalette *QS60StylePrivate::m_themePalette = 0; +qint64 QS60StylePrivate::m_webPaletteKey = 0; + const struct QS60StylePrivate::frameElementCenter QS60StylePrivate::m_frameElementsData[] = { {SE_ButtonNormal, QS60StyleEnums::SP_QsnFrButtonTbCenter}, {SE_ButtonPressed, QS60StyleEnums::SP_QsnFrButtonTbCenterPressed}, @@ -807,8 +809,12 @@ void QS60StylePrivate::setThemePaletteHash(QPalette *palette) const QPalette webPalette = *palette; webPalette.setColor(QPalette::WindowText, Qt::black); webPalette.setColor(QPalette::Text, Qt::black); + webPalette.setBrush(QPalette::Base, Qt::white); + QApplication::setPalette(webPalette, "QWebView"); QApplication::setPalette(webPalette, "QGraphicsWebView"); + + m_webPaletteKey = webPalette.cacheKey(); } QSize QS60StylePrivate::partSize(QS60StyleEnums::SkinParts part, SkinElementFlags flags) @@ -896,8 +902,11 @@ QSize QS60StylePrivate::partSize(QS60StyleEnums::SkinParts part, SkinElementFlag return result; } -bool QS60StylePrivate::canDrawThemeBackground(const QBrush &backgroundBrush) +bool QS60StylePrivate::canDrawThemeBackground(const QBrush &backgroundBrush, const QWidget *widget) { + // Always return true for web pages. + if (widget && m_webPaletteKey == QApplication::palette(widget).cacheKey()) + return true; //If brush is not changed from style's default values, draw theme graphics. return (backgroundBrush.color() == Qt::transparent || backgroundBrush.style() == Qt::NoBrush) ? true : false; @@ -1901,7 +1910,7 @@ void QS60Style::drawControl(ControlElement element, const QStyleOption *option, case CE_ShapedFrame: if (const QTextEdit *textEdit = qobject_cast<const QTextEdit *>(widget)) { const QStyleOptionFrame *frame = qstyleoption_cast<const QStyleOptionFrame *>(option); - if (QS60StylePrivate::canDrawThemeBackground(frame->palette.base())) + if (QS60StylePrivate::canDrawThemeBackground(frame->palette.base(), widget)) QS60StylePrivate::drawSkinElement(QS60StylePrivate::SE_Editor, painter, option->rect, flags); else QCommonStyle::drawControl(element, option, painter, widget); @@ -2013,7 +2022,7 @@ void QS60Style::drawPrimitive(PrimitiveElement element, const QStyleOption *opti if (widget && qobject_cast<const QComboBox *>(widget->parentWidget())) break; #endif - if (QS60StylePrivate::canDrawThemeBackground(option->palette.base())) + if (QS60StylePrivate::canDrawThemeBackground(option->palette.base(), widget)) QS60StylePrivate::drawSkinElement(QS60StylePrivate::SE_FrameLineEdit, painter, option->rect, flags); else commonStyleDraws = true; @@ -2093,7 +2102,7 @@ void QS60Style::drawPrimitive(PrimitiveElement element, const QStyleOption *opti case PE_PanelButtonTool: case PE_PanelButtonBevel: case PE_FrameButtonBevel: - if (QS60StylePrivate::canDrawThemeBackground(option->palette.base())) { + if (QS60StylePrivate::canDrawThemeBackground(option->palette.base(), widget)) { const bool isPressed = option->state & State_Sunken; const QS60StylePrivate::SkinElements skinElement = isPressed ? QS60StylePrivate::SE_ButtonPressed : QS60StylePrivate::SE_ButtonNormal; @@ -2125,7 +2134,7 @@ void QS60Style::drawPrimitive(PrimitiveElement element, const QStyleOption *opti case PE_IndicatorSpinDown: case PE_IndicatorSpinUp: if (const QStyleOptionSpinBox *spinBox = qstyleoption_cast<const QStyleOptionSpinBox *>(option)) { - if (QS60StylePrivate::canDrawThemeBackground(spinBox->palette.base())) { + if (QS60StylePrivate::canDrawThemeBackground(spinBox->palette.base(), widget)) { QStyleOptionSpinBox optionSpinBox = *spinBox; const QS60StyleEnums::SkinParts part = (element == PE_IndicatorSpinUp) ? QS60StyleEnums::SP_QgnGrafScrollArrowUp : @@ -2140,7 +2149,7 @@ void QS60Style::drawPrimitive(PrimitiveElement element, const QStyleOption *opti #endif //QT_NO_SPINBOX #ifndef QT_NO_COMBOBOX if (const QStyleOptionFrame *cmb = qstyleoption_cast<const QStyleOptionFrame *>(option)) { - if (QS60StylePrivate::canDrawThemeBackground( option->palette.base())) { + if (QS60StylePrivate::canDrawThemeBackground( option->palette.base(), widget)) { // We want to draw down arrow here for comboboxes as well. QStyleOptionFrame optionsComboBox = *cmb; const QS60StyleEnums::SkinParts part = QS60StyleEnums::SP_QgnGrafScrollArrowDown; @@ -2179,7 +2188,7 @@ void QS60Style::drawPrimitive(PrimitiveElement element, const QStyleOption *opti #endif //QT_NO_MENU ) { //Need extra check since dialogs have their own theme background - if (QS60StylePrivate::canDrawThemeBackground(option->palette.base()) && + if (QS60StylePrivate::canDrawThemeBackground(option->palette.base(), widget) && option->palette.window().texture().cacheKey() == QS60StylePrivate::m_themePalette->window().texture().cacheKey()) QS60StylePrivate::drawSkinElement(QS60StylePrivate::SE_OptionsMenu, painter, option->rect, flags); @@ -2387,10 +2396,20 @@ QSize QS60Style::sizeFromContents(ContentsType ct, const QStyleOption *opt, case CT_PushButton: sz = QCommonStyle::sizeFromContents( ct, opt, csz, widget); //FIXME properly - style should calculate the location of border frame-part - sz += QSize(2 * pixelMetric(PM_ButtonMargin), 2 * pixelMetric(PM_ButtonMargin)); - if (const QAbstractButton *buttonWidget = (qobject_cast<const QAbstractButton *>(widget))) + if (const QAbstractButton *buttonWidget = (qobject_cast<const QAbstractButton *>(widget))) { if (buttonWidget->isCheckable()) sz += QSize(pixelMetric(PM_IndicatorWidth) + pixelMetric(PM_CheckBoxLabelSpacing), 0); + const int iconHeight = (!buttonWidget->icon().isNull()) ? buttonWidget->iconSize().height() : 0; + const int textHeight = (buttonWidget->text().length() > 0) ? + buttonWidget->fontMetrics().size(Qt::TextSingleLine, buttonWidget->text()).height() : 0; + const int decoratorHeight = (buttonWidget->isCheckable()) ? pixelMetric(PM_IndicatorHeight) : 0; + + const int contentHeight = + qMax(qMax(iconHeight, decoratorHeight) + pixelMetric(PM_ButtonMargin), + textHeight + 2*pixelMetric(PM_ButtonMargin)); + sz.setHeight(contentHeight); + sz += QSize(2 * pixelMetric(PM_ButtonMargin), 0); + } break; case CT_LineEdit: if (const QStyleOptionFrame *f = qstyleoption_cast<const QStyleOptionFrame *>(opt)) diff --git a/src/gui/styles/qs60style_p.h b/src/gui/styles/qs60style_p.h index ea30b81..16d82e7 100644 --- a/src/gui/styles/qs60style_p.h +++ b/src/gui/styles/qs60style_p.h @@ -542,7 +542,7 @@ public: //Checks that the current brush is transparent or has BrushStyle NoBrush, //so that theme graphic background can be drawn. - static bool canDrawThemeBackground(const QBrush &backgroundBrush); + static bool canDrawThemeBackground(const QBrush &backgroundBrush, const QWidget *widget); static int currentAnimationFrame(QS60StyleEnums::SkinParts part); #ifdef Q_WS_S60 @@ -596,6 +596,7 @@ private: QPalette m_originalPalette; QPointer<QFocusFrame> m_focusFrame; + static qint64 m_webPaletteKey; #ifdef Q_WS_S60 //list of progress bars having animation running diff --git a/src/gui/text/qfontdatabase_win.cpp b/src/gui/text/qfontdatabase_win.cpp index b30a6c3..c50d363 100644 --- a/src/gui/text/qfontdatabase_win.cpp +++ b/src/gui/text/qfontdatabase_win.cpp @@ -336,8 +336,18 @@ void addFontToDatabase(QString familyName, const QString &scriptName, signature->fsCsb[0], signature->fsCsb[1] }; QList<QFontDatabase::WritingSystem> systems = determineWritingSystemsFromTrueTypeBits(unicodeRange, codePageRange); - for (int i = 0; i < systems.count(); ++i) - family->writingSystems[systems.at(i)] = QtFontFamily::Supported; + + for (int i = 0; i < systems.count(); ++i) { + QFontDatabase::WritingSystem writingSystem = systems.at(i); + + // ### Hack to work around problem with Thai text on Windows 7. Segoe UI contains + // the symbol for Baht, and Windows thus reports that it supports the Thai script. + // Since it's the default UI font on this platform, most widgets will be unable to + // display Thai text by default. As a temporary work around, we special case Segoe UI + // and remove the Thai script from its list of supported writing systems. + if (writingSystem != QFontDatabase::Thai || familyName != QLatin1String("Segoe UI")) + family->writingSystems[writingSystem] = QtFontFamily::Supported; + } } else if (!family->writingSystemCheck) { //qDebug("family='%s' script=%s", family->name.latin1(), script.latin1()); if (scriptName == QLatin1String("Western") diff --git a/src/gui/util/qdesktopservices_s60.cpp b/src/gui/util/qdesktopservices_s60.cpp index 0f5792f..65b998f 100644 --- a/src/gui/util/qdesktopservices_s60.cpp +++ b/src/gui/util/qdesktopservices_s60.cpp @@ -48,7 +48,6 @@ #include <qurl.h> #include <private/qcore_symbian_p.h> -#include <miutset.h> // KUidMsgTypeSMTP #include <txtrich.h> // CRichText #include <f32file.h> // TDriveUnit etc #include <eikenv.h> // CEikonEnv @@ -57,6 +56,9 @@ #include <rsendas.h> // RSendAs #include <rsendasmessage.h> // RSendAsMessage +// copied from miutset.h, so we don't get a dependency into the app layer +const TUid KUidMsgTypeSMTP = {0x10001028}; // 268439592 + #ifdef Q_WS_S60 # include <pathinfo.h> // PathInfo # ifdef USE_DOCUMENTHANDLER diff --git a/src/gui/widgets/qcombobox.cpp b/src/gui/widgets/qcombobox.cpp index be20a38..f71d250 100644 --- a/src/gui/widgets/qcombobox.cpp +++ b/src/gui/widgets/qcombobox.cpp @@ -607,7 +607,13 @@ void QComboBoxPrivateContainer::changeEvent(QEvent *e) view->setMouseTracking(combo->style()->styleHint(QStyle::SH_ComboBox_ListMouseTracking, &opt, combo) || combo->style()->styleHint(QStyle::SH_ComboBox_Popup, &opt, combo)); setFrameStyle(combo->style()->styleHint(QStyle::SH_ComboBox_PopupFrameStyle, &opt, combo)); +#ifdef QT_SOFTKEYS_ENABLED + } else if (e->type() == QEvent::LanguageChange) { + selectAction->setText(QSoftKeyManager::standardSoftKeyText(QSoftKeyManager::SelectSoftKey)); + cancelAction->setText(QSoftKeyManager::standardSoftKeyText(QSoftKeyManager::CancelSoftKey)); +#endif } + QWidget::changeEvent(e); } diff --git a/src/gui/widgets/qdockarealayout.cpp b/src/gui/widgets/qdockarealayout.cpp index 13f31df..2b8cf59 100644 --- a/src/gui/widgets/qdockarealayout.cpp +++ b/src/gui/widgets/qdockarealayout.cpp @@ -2637,7 +2637,7 @@ void QDockAreaLayout::getGrid(QVector<QLayoutStruct> *_ver_struct_list, QSize bottom_max = docks[QInternal::BottomDock].maximumSize(); bottom_hint = bottom_hint.boundedTo(bottom_max).expandedTo(bottom_min); - fallbackToSizeHints = !have_central; + fallbackToSizeHints = false; if (_ver_struct_list != 0) { QVector<QLayoutStruct> &ver_struct_list = *_ver_struct_list; diff --git a/src/gui/widgets/qmainwindow.cpp b/src/gui/widgets/qmainwindow.cpp index a63f3bf..4620597 100644 --- a/src/gui/widgets/qmainwindow.cpp +++ b/src/gui/widgets/qmainwindow.cpp @@ -1427,6 +1427,11 @@ bool QMainWindow::event(QEvent *event) } break; #endif +#ifdef QT_SOFTKEYS_ENABLED + case QEvent::LanguageChange: + d->menuBarAction->setText(QSoftKeyManager::standardSoftKeyText(QSoftKeyManager::MenuSoftKey)); + break; +#endif default: break; } diff --git a/src/gui/widgets/qmainwindowlayout.cpp b/src/gui/widgets/qmainwindowlayout.cpp index fc75c92..593e391 100644 --- a/src/gui/widgets/qmainwindowlayout.cpp +++ b/src/gui/widgets/qmainwindowlayout.cpp @@ -1772,6 +1772,7 @@ void QMainWindowLayout::setCentralWidget(QWidget *widget) if (savedState.isValid()) { #ifndef QT_NO_DOCKWIDGET savedState.dockAreaLayout.centralWidgetItem = layoutState.dockAreaLayout.centralWidgetItem; + savedState.dockAreaLayout.fallbackToSizeHints = true; #else savedState.centralWidgetItem = layoutState.centralWidgetItem; #endif diff --git a/src/gui/widgets/qmenu.cpp b/src/gui/widgets/qmenu.cpp index 08960da..e2cf25b 100644 --- a/src/gui/widgets/qmenu.cpp +++ b/src/gui/widgets/qmenu.cpp @@ -117,7 +117,7 @@ public: if (parentWidget->parentWidget()) parentWidget = parentWidget->parentWidget(); setParent(parentWidget, Qt::Window | Qt::Tool); - setAttribute(Qt::WA_DeleteOnClose, true); + setAttribute(Qt::WA_DeleteOnClose, true); setAttribute(Qt::WA_X11NetWmWindowTypeMenu, true); setWindowTitle(p->windowTitle()); setEnabled(p->isEnabled()); @@ -1226,7 +1226,7 @@ void QMenu::initStyleOption(QStyleOptionMenuItem *option, const QAction *action) else if (action->isSeparator()) option->menuItemType = QStyleOptionMenuItem::Separator; else if (d->defaultAction == action) - option->menuItemType = QStyleOptionMenuItem::DefaultItem; + option->menuItemType = QStyleOptionMenuItem::DefaultItem; else option->menuItemType = QStyleOptionMenuItem::Normal; if (action->isIconVisibleInMenu()) @@ -1719,7 +1719,14 @@ bool QMenu::isEmpty() const void QMenu::clear() { QList<QAction*> acts = actions(); + for(int i = 0; i < acts.size(); i++) { +#ifdef QT_SOFTKEYS_ENABLED + Q_D(QMenu); + // Lets not touch to our internal softkey actions + if(acts[i] == d->selectAction || acts[i] == d->cancelAction) + continue; +#endif removeAction(acts[i]); if (acts[i]->parent() == this && acts[i]->d_func()->widgets.isEmpty()) delete acts[i]; @@ -2406,6 +2413,13 @@ QMenu::event(QEvent *e) } return true; #endif +#ifdef QT_SOFTKEYS_ENABLED + case QEvent::LanguageChange: { + d->selectAction->setText(QSoftKeyManager::standardSoftKeyText(QSoftKeyManager::SelectSoftKey)); + d->cancelAction->setText(QSoftKeyManager::standardSoftKeyText(QSoftKeyManager::CancelSoftKey)); + } + break; +#endif default: break; } @@ -2917,7 +2931,7 @@ void QMenu::actionEvent(QActionEvent *e) #endif if (isVisible()) { d->updateActionRects(); - resize(sizeHint()); + resize(sizeHint()); update(); } } diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp index cc6a1c8..62aa2d7 100644 --- a/src/network/access/qhttpnetworkconnection.cpp +++ b/src/network/access/qhttpnetworkconnection.cpp @@ -404,6 +404,7 @@ QHttpNetworkReply* QHttpNetworkConnectionPrivate::queueRequest(const QHttpNetwor QHttpNetworkReply *reply = new QHttpNetworkReply(request.url()); reply->setRequest(request); reply->d_func()->connection = q; + reply->d_func()->connectionChannel = &channels[0]; // will have the correct one set later HttpMessagePair pair = qMakePair(request, reply); switch (request.priority()) { @@ -688,14 +689,12 @@ void QHttpNetworkConnectionPrivate::_q_startNextRequest() if (channels[i].resendCurrent) { channels[i].resendCurrent = false; channels[i].state = QHttpNetworkConnectionChannel::IdleState; - if (channels[i].reply) { - // if this is not possible, error will be emitted and connection terminated - if (!channels[i].resetUploadData()) - continue; + // if this is not possible, error will be emitted and connection terminated + if (!channels[i].resetUploadData()) + continue; - channels[i].sendRequest(); - } + channels[i].sendRequest(); } } @@ -861,17 +860,6 @@ QNetworkProxy QHttpNetworkConnection::transparentProxy() const // SSL support below #ifndef QT_NO_OPENSSL -QSslConfiguration QHttpNetworkConnectionPrivate::sslConfiguration(const QHttpNetworkReply &reply) const -{ - if (!encrypt) - return QSslConfiguration(); - - for (int i = 0; i < channelCount; ++i) - if (channels[i].reply == &reply) - return static_cast<QSslSocket *>(channels[0].socket)->sslConfiguration(); - return QSslConfiguration(); // pending or done request -} - void QHttpNetworkConnection::setSslConfiguration(const QSslConfiguration &config) { Q_D(QHttpNetworkConnection); diff --git a/src/network/access/qhttpnetworkconnection_p.h b/src/network/access/qhttpnetworkconnection_p.h index 03cf09c..823774e 100644 --- a/src/network/access/qhttpnetworkconnection_p.h +++ b/src/network/access/qhttpnetworkconnection_p.h @@ -210,11 +210,6 @@ public: void emitReplyError(QAbstractSocket *socket, QHttpNetworkReply *reply, QNetworkReply::NetworkError errorCode); bool handleAuthenticateChallenge(QAbstractSocket *socket, QHttpNetworkReply *reply, bool isProxy, bool &resend); - -#ifndef QT_NO_OPENSSL - QSslConfiguration sslConfiguration(const QHttpNetworkReply &reply) const; -#endif - #ifndef QT_NO_NETWORKPROXY QNetworkProxy networkProxy; void emitProxyAuthenticationRequired(const QHttpNetworkConnectionChannel *chan, const QNetworkProxy &proxy, QAuthenticator* auth); diff --git a/src/network/access/qhttpnetworkconnectionchannel.cpp b/src/network/access/qhttpnetworkconnectionchannel.cpp index b0e632a..dbee72a 100644 --- a/src/network/access/qhttpnetworkconnectionchannel.cpp +++ b/src/network/access/qhttpnetworkconnectionchannel.cpp @@ -124,6 +124,13 @@ void QHttpNetworkConnectionChannel::close() bool QHttpNetworkConnectionChannel::sendRequest() { + if (!reply) { + // heh, how should that happen! + qWarning() << "QHttpNetworkConnectionChannel::sendRequest() called without QHttpNetworkReply"; + state = QHttpNetworkConnectionChannel::IdleState; + return false; + } + switch (state) { case QHttpNetworkConnectionChannel::IdleState: { // write the header if (!ensureConnection()) { @@ -134,13 +141,13 @@ bool QHttpNetworkConnectionChannel::sendRequest() } written = 0; // excluding the header bytesTotal = 0; - if (reply) { - reply->d_func()->clear(); - reply->d_func()->connection = connection; - reply->d_func()->autoDecompress = request.d->autoDecompress; - reply->d_func()->pipeliningUsed = false; - } - state = QHttpNetworkConnectionChannel::WritingState; + + reply->d_func()->clear(); + reply->d_func()->connection = connection; + reply->d_func()->connectionChannel = this; + reply->d_func()->autoDecompress = request.d->autoDecompress; + reply->d_func()->pipeliningUsed = false; + pendingEncrypt = false; // if the url contains authentication parameters, use the new ones // both channels will use the new authentication parameters @@ -174,13 +181,15 @@ bool QHttpNetworkConnectionChannel::sendRequest() QObject::connect(uploadByteDevice, SIGNAL(readyRead()),this, SLOT(_q_uploadDataReadyRead())); bytesTotal = request.contentLength(); + + state = QHttpNetworkConnectionChannel::WritingState; // start writing data + sendRequest(); //recurse } else { - state = QHttpNetworkConnectionChannel::WaitingState; - sendRequest(); - break; + state = QHttpNetworkConnectionChannel::WaitingState; // now wait for response + sendRequest(); //recurse } - // write the initial chunk together with the headers - // fall through + + break; } case QHttpNetworkConnectionChannel::WritingState: { @@ -190,7 +199,7 @@ bool QHttpNetworkConnectionChannel::sendRequest() if (uploadByteDevice) emit reply->dataSendProgress(written, bytesTotal); state = QHttpNetworkConnectionChannel::WaitingState; // now wait for response - sendRequest(); + sendRequest(); // recurse break; } @@ -278,51 +287,50 @@ void QHttpNetworkConnectionChannel::_q_receiveReply() { Q_ASSERT(socket); + if (!reply) { + // heh, how should that happen! + qWarning() << "QHttpNetworkConnectionChannel::_q_receiveReply() called without QHttpNetworkReply," + << socket->bytesAvailable() << "bytes on socket."; + close(); + return; + } + qint64 bytes = 0; QAbstractSocket::SocketState socketState = socket->state(); // connection might be closed to signal the end of data if (socketState == QAbstractSocket::UnconnectedState) { - if (!socket->bytesAvailable()) { - if (reply && reply->d_func()->state == QHttpNetworkReplyPrivate::ReadingDataState) { + if (socket->bytesAvailable() <= 0) { + if (reply->d_func()->state == QHttpNetworkReplyPrivate::ReadingDataState) { + // finish this reply. this case happens when the server did not send a content length reply->d_func()->state = QHttpNetworkReplyPrivate::AllDoneState; allDone(); + return; } else { - // try to reconnect/resend before sending an error. - if (reconnectAttempts-- > 0) { - closeAndResendCurrentRequest(); - } else if (reply) { - reply->d_func()->errorString = connection->d_func()->errorDetail(QNetworkReply::RemoteHostClosedError, socket); - emit reply->finishedWithError(QNetworkReply::RemoteHostClosedError, reply->d_func()->errorString); - QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection); - } + handleUnexpectedEOF(); + return; } + } else { + // socket not connected but still bytes for reading.. just continue in this function } } // read loop for the response while (socket->bytesAvailable()) { - QHttpNetworkReplyPrivate::ReplyState state = reply ? reply->d_func()->state : QHttpNetworkReplyPrivate::AllDoneState; + QHttpNetworkReplyPrivate::ReplyState state = reply->d_func()->state; switch (state) { case QHttpNetworkReplyPrivate::NothingDoneState: { // only eat whitespace on the first call eatWhitespace(); state = reply->d_func()->state = QHttpNetworkReplyPrivate::ReadingStatusState; + // fallthrough } case QHttpNetworkReplyPrivate::ReadingStatusState: { qint64 statusBytes = reply->d_func()->readStatus(socket); - if (statusBytes == -1 && reconnectAttempts <= 0) { - // too many errors reading/receiving/parsing the status, close the socket and emit error - close(); - reply->d_func()->errorString = connection->d_func()->errorDetail(QNetworkReply::ProtocolFailure, socket); - emit reply->finishedWithError(QNetworkReply::ProtocolFailure, reply->d_func()->errorString); - QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection); - break; - } else if (statusBytes == -1) { - reconnectAttempts--; - reply->d_func()->clear(); - closeAndResendCurrentRequest(); - break; + if (statusBytes == -1) { + // connection broke while reading status. also handled if later _q_disconnected is called + handleUnexpectedEOF(); + return; } bytes += statusBytes; lastStatus = reply->d_func()->statusCode; @@ -330,7 +338,13 @@ void QHttpNetworkConnectionChannel::_q_receiveReply() } case QHttpNetworkReplyPrivate::ReadingHeaderState: { QHttpNetworkReplyPrivate *replyPrivate = reply->d_func(); - bytes += replyPrivate->readHeader(socket); + qint64 headerBytes = replyPrivate->readHeader(socket); + if (headerBytes == -1) { + // connection broke while reading headers. also handled if later _q_disconnected is called + handleUnexpectedEOF(); + return; + } + bytes += headerBytes; if (replyPrivate->state == QHttpNetworkReplyPrivate::ReadingDataState) { if (replyPrivate->isGzipped() && replyPrivate->autoDecompress) { // remove the Content-Length from header @@ -417,8 +431,10 @@ void QHttpNetworkConnectionChannel::_q_receiveReply() #endif } } + // still in ReadingDataState? This function will be called again by the socket's readyRead if (replyPrivate->state == QHttpNetworkReplyPrivate::ReadingDataState) break; + // everything done, fall through } case QHttpNetworkReplyPrivate::AllDoneState: @@ -430,6 +446,23 @@ void QHttpNetworkConnectionChannel::_q_receiveReply() } } +// called when unexpectedly reading a -1 or when data is expected but socket is closed +void QHttpNetworkConnectionChannel::handleUnexpectedEOF() +{ + if (reconnectAttempts <= 0) { + // too many errors reading/receiving/parsing the status, close the socket and emit error + requeueCurrentlyPipelinedRequests(); + close(); + reply->d_func()->errorString = connection->d_func()->errorDetail(QNetworkReply::RemoteHostClosedError, socket); + emit reply->finishedWithError(QNetworkReply::RemoteHostClosedError, reply->d_func()->errorString); + QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection); + } else { + reconnectAttempts--; + reply->d_func()->clear(); + closeAndResendCurrentRequest(); + } +} + bool QHttpNetworkConnectionChannel::ensureConnection() { QAbstractSocket::SocketState socketState = socket->state(); @@ -556,7 +589,8 @@ void QHttpNetworkConnectionChannel::allDone() handleStatus(); // ### at this point there should be no more data on the socket // close if server requested - if (reply->d_func()->isConnectionCloseEnabled()) + bool connectionCloseEnabled = reply->d_func()->isConnectionCloseEnabled(); + if (connectionCloseEnabled) close(); // queue the finished signal, this is required since we might send new requests from // slot connected to it. The socket will not fire readyRead signal, if we are already @@ -567,14 +601,22 @@ void QHttpNetworkConnectionChannel::allDone() // in case of failures, each channel will attempt two reconnects before emitting error. reconnectAttempts = 2; + detectPipeliningSupport(); + // now the channel can be seen as free/idle again, all signal emissions for the reply have been done this->state = QHttpNetworkConnectionChannel::IdleState; - detectPipeliningSupport(); + // if it does not need to be sent again we can set it to 0 + // the previous code did not do that and we had problems with accidental re-sending of a + // finished request. + // Note that this may trigger a segfault at some other point. But then we can fix the underlying + // problem. + if (!resendCurrent) + reply = 0; // move next from pipeline to current request if (!alreadyPipelinedRequests.isEmpty()) { - if (resendCurrent || reply->d_func()->isConnectionCloseEnabled() || socket->state() != QAbstractSocket::ConnectedState) { + if (resendCurrent || connectionCloseEnabled || socket->state() != QAbstractSocket::ConnectedState) { // move the pipelined ones back to the main queue requeueCurrentlyPipelinedRequests(); close(); @@ -730,12 +772,11 @@ void QHttpNetworkConnectionChannel::pipelineInto(HttpMessagePair &pair) QHttpNetworkRequest &request = pair.first; QHttpNetworkReply *reply = pair.second; - if (reply) { - reply->d_func()->clear(); - reply->d_func()->connection = connection; - reply->d_func()->autoDecompress = request.d->autoDecompress; - reply->d_func()->pipeliningUsed = true; - } + reply->d_func()->clear(); + reply->d_func()->connection = connection; + reply->d_func()->connectionChannel = this; + reply->d_func()->autoDecompress = request.d->autoDecompress; + reply->d_func()->pipeliningUsed = true; #ifndef QT_NO_NETWORKPROXY QByteArray header = QHttpNetworkRequestPrivate::header(request, @@ -799,9 +840,10 @@ void QHttpNetworkConnectionChannel::_q_disconnected() { // read the available data before closing if (isSocketWaiting() || isSocketReading()) { - state = QHttpNetworkConnectionChannel::ReadingState; - if (reply) + if (reply) { + state = QHttpNetworkConnectionChannel::ReadingState; _q_receiveReply(); + } } else if (state == QHttpNetworkConnectionChannel::IdleState && resendCurrent) { // re-sending request because the socket was in ClosingState QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection); diff --git a/src/network/access/qhttpnetworkconnectionchannel_p.h b/src/network/access/qhttpnetworkconnectionchannel_p.h index 75ab50d..5032d2b 100644 --- a/src/network/access/qhttpnetworkconnectionchannel_p.h +++ b/src/network/access/qhttpnetworkconnectionchannel_p.h @@ -157,6 +157,7 @@ public: void requeueCurrentlyPipelinedRequests(); void detectPipeliningSupport(); + void handleUnexpectedEOF(); void closeAndResendCurrentRequest(); void eatWhitespace(); diff --git a/src/network/access/qhttpnetworkreply.cpp b/src/network/access/qhttpnetworkreply.cpp index 512c045..984f557 100644 --- a/src/network/access/qhttpnetworkreply.cpp +++ b/src/network/access/qhttpnetworkreply.cpp @@ -230,6 +230,7 @@ void QHttpNetworkReplyPrivate::clear() currentChunkRead = 0; connectionCloseEnabled = true; connection = 0; + connectionChannel = 0; #ifndef QT_NO_COMPRESS if (initInflate) inflateEnd(&inflateStrm); @@ -803,9 +804,15 @@ void QHttpNetworkReplyPrivate::eraseData() QSslConfiguration QHttpNetworkReply::sslConfiguration() const { Q_D(const QHttpNetworkReply); - if (d->connection) - return d->connection->d_func()->sslConfiguration(*this); - return QSslConfiguration(); + + if (!d->connectionChannel) + return QSslConfiguration(); + + QSslSocket *sslSocket = qobject_cast<QSslSocket*>(d->connectionChannel->socket); + if (!sslSocket) + return QSslConfiguration(); + + return sslSocket->sslConfiguration(); } void QHttpNetworkReply::setSslConfiguration(const QSslConfiguration &config) diff --git a/src/network/access/qhttpnetworkreply_p.h b/src/network/access/qhttpnetworkreply_p.h index af9266b..fa240ec 100644 --- a/src/network/access/qhttpnetworkreply_p.h +++ b/src/network/access/qhttpnetworkreply_p.h @@ -86,6 +86,7 @@ static const unsigned char gz_magic[2] = {0x1f, 0x8b}; // gzip magic header QT_BEGIN_NAMESPACE class QHttpNetworkConnection; +class QHttpNetworkConnectionChannel; class QHttpNetworkRequest; class QHttpNetworkConnectionPrivate; class QHttpNetworkReplyPrivate; @@ -218,6 +219,7 @@ public: qint64 currentChunkSize; qint64 currentChunkRead; QPointer<QHttpNetworkConnection> connection; + QPointer<QHttpNetworkConnectionChannel> connectionChannel; bool initInflate; bool streamEnd; #ifndef QT_NO_COMPRESS diff --git a/src/network/access/qnetworkaccesshttpbackend.cpp b/src/network/access/qnetworkaccesshttpbackend.cpp index c8f4e5b..dcd4e19 100644 --- a/src/network/access/qnetworkaccesshttpbackend.cpp +++ b/src/network/access/qnetworkaccesshttpbackend.cpp @@ -999,7 +999,7 @@ QNetworkCacheMetaData QNetworkAccessHttpBackend::fetchCacheMetaData(const QNetwo // of writes to disk when using a QNetworkDiskCache (i.e. don't // write to disk when only the date changes). // However, without the date we cannot calculate the age of the page - // anymore. Consider a proper fix of that problem for 4.6.1. + // anymore. //if (header == "date") //continue; diff --git a/src/network/socket/qlocalsocket_p.h b/src/network/socket/qlocalsocket_p.h index 081697b..0f1c23c 100644 --- a/src/network/socket/qlocalsocket_p.h +++ b/src/network/socket/qlocalsocket_p.h @@ -128,10 +128,8 @@ public: void _q_stateChanged(QAbstractSocket::SocketState newState); void _q_error(QAbstractSocket::SocketError newError); #elif defined(Q_OS_WIN) - ~QLocalSocketPrivate() { - CloseHandle(overlapped.hEvent); - } - + ~QLocalSocketPrivate(); + void destroyPipeHandles(); void setErrorString(const QString &function); void _q_notified(); void _q_canWrite(); diff --git a/src/network/socket/qlocalsocket_win.cpp b/src/network/socket/qlocalsocket_win.cpp index 1f94df6..3283bf2 100644 --- a/src/network/socket/qlocalsocket_win.cpp +++ b/src/network/socket/qlocalsocket_win.cpp @@ -110,6 +110,20 @@ QLocalSocketPrivate::QLocalSocketPrivate() : QIODevicePrivate(), { } +QLocalSocketPrivate::~QLocalSocketPrivate() +{ + destroyPipeHandles(); + CloseHandle(overlapped.hEvent); +} + +void QLocalSocketPrivate::destroyPipeHandles() +{ + if (handle != INVALID_HANDLE_VALUE) { + DisconnectNamedPipe(handle); + CloseHandle(handle); + } +} + void QLocalSocket::connectToServer(const QString &name, OpenMode openMode) { Q_D(QLocalSocket); @@ -388,8 +402,7 @@ void QLocalSocket::close() d->readSequenceStarted = false; d->pendingReadyRead = false; d->pipeClosed = false; - DisconnectNamedPipe(d->handle); - CloseHandle(d->handle); + d->destroyPipeHandles(); d->handle = INVALID_HANDLE_VALUE; ResetEvent(d->overlapped.hEvent); d->state = UnconnectedState; @@ -524,7 +537,10 @@ bool QLocalSocket::waitForDisconnected(int msecs) bool QLocalSocket::isValid() const { Q_D(const QLocalSocket); - return (d->handle != INVALID_HANDLE_VALUE); + if (d->handle == INVALID_HANDLE_VALUE) + return false; + + return PeekNamedPipe(d->handle, NULL, 0, NULL, NULL, NULL); } bool QLocalSocket::waitForReadyRead(int msecs) diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp index c34cf89..ea464d5 100644 --- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp +++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp @@ -91,7 +91,7 @@ QT_BEGIN_NAMESPACE //#define QT_GL_NO_SCISSOR_TEST -#ifdef Q_WS_WIN +#if defined(Q_WS_WIN) extern Q_GUI_EXPORT bool qt_cleartype_enabled; #endif @@ -1357,7 +1357,7 @@ void QGL2PaintEngineEx::drawTextItem(const QPointF &p, const QTextItem &textItem if (glyphType == QFontEngineGlyphCache::Raster_RGBMask) { - if (d->deviceHasAlpha || txtype > QTransform::TxTranslate + if (d->device->alphaRequested() || txtype > QTransform::TxTranslate || (state()->composition_mode != QPainter::CompositionMode_Source && state()->composition_mode != QPainter::CompositionMode_SourceOver)) { diff --git a/src/opengl/qgl.cpp b/src/opengl/qgl.cpp index f3c66f2..2ed185f 100644 --- a/src/opengl/qgl.cpp +++ b/src/opengl/qgl.cpp @@ -1692,18 +1692,18 @@ QGLTextureCache::QGLTextureCache() Q_ASSERT(qt_gl_texture_cache == 0); qt_gl_texture_cache = this; - QImagePixmapCleanupHooks::instance()->addPixmapDataModificationHook(cleanupTextures); + QImagePixmapCleanupHooks::instance()->addPixmapDataModificationHook(cleanupTexturesForPixampData); QImagePixmapCleanupHooks::instance()->addPixmapDataDestructionHook(cleanupBeforePixmapDestruction); - QImagePixmapCleanupHooks::instance()->addImageHook(imageCleanupHook); + QImagePixmapCleanupHooks::instance()->addImageHook(cleanupTexturesForCacheKey); } QGLTextureCache::~QGLTextureCache() { qt_gl_texture_cache = 0; - QImagePixmapCleanupHooks::instance()->removePixmapDataModificationHook(cleanupTextures); + QImagePixmapCleanupHooks::instance()->removePixmapDataModificationHook(cleanupTexturesForPixampData); QImagePixmapCleanupHooks::instance()->removePixmapDataDestructionHook(cleanupBeforePixmapDestruction); - QImagePixmapCleanupHooks::instance()->removeImageHook(imageCleanupHook); + QImagePixmapCleanupHooks::instance()->removeImageHook(cleanupTexturesForCacheKey); } void QGLTextureCache::insert(QGLContext* ctx, qint64 key, QGLTexture* texture, int cost) @@ -1762,26 +1762,22 @@ QGLTextureCache* QGLTextureCache::instance() a hook that removes textures from the cache when a pixmap/image is deref'ed */ -void QGLTextureCache::imageCleanupHook(qint64 cacheKey) +void QGLTextureCache::cleanupTexturesForCacheKey(qint64 cacheKey) { - QGLTexture *texture = instance()->getTexture(cacheKey); - if (texture && texture->options & QGLContext::MemoryManagedBindOption) - instance()->remove(cacheKey); + instance()->remove(cacheKey); + Q_ASSERT(instance()->getTexture(cacheKey) == 0); } -void QGLTextureCache::cleanupTextures(QPixmapData* pmd) +void QGLTextureCache::cleanupTexturesForPixampData(QPixmapData* pmd) { - const qint64 cacheKey = pmd->cacheKey(); - QGLTexture *texture = instance()->getTexture(cacheKey); - if (texture && texture->options & QGLContext::MemoryManagedBindOption) - instance()->remove(cacheKey); + cleanupTexturesForCacheKey(pmd->cacheKey()); } void QGLTextureCache::cleanupBeforePixmapDestruction(QPixmapData* pmd) { // Remove any bound textures first: - cleanupTextures(pmd); + cleanupTexturesForPixampData(pmd); #if defined(Q_WS_X11) if (pmd->classId() == QPixmapData::X11Class) { @@ -2182,8 +2178,9 @@ QGLTexture *QGLContextPrivate::bindTexture(const QImage &image, GLenum target, G // NOTE: bindTexture(const QImage&, GLenum, GLint, const qint64, bool) should never return null Q_ASSERT(texture); - if (texture->id > 0) - QImagePixmapCleanupHooks::enableCleanupHooks(image); + // Enable the cleanup hooks for this image so that the texture cache entry is removed when the + // image gets deleted: + QImagePixmapCleanupHooks::enableCleanupHooks(image); return texture; } @@ -2237,6 +2234,7 @@ QGLTexture* QGLContextPrivate::bindTexture(const QImage &image, GLenum target, G int tx_h = qt_next_power_of_two(image.height()); QImage img = image; + if (!(QGLExtensions::glExtensions() & QGLExtensions::NPOTTextures) && !(QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_ES_Version_2_0) && (target == GL_TEXTURE_2D && (tx_w != image.width() || tx_h != image.height()))) @@ -2405,6 +2403,7 @@ QGLTexture* QGLContextPrivate::bindTexture(const QImage &image, GLenum target, G int cost = img.width()*img.height()*4/1024; QGLTexture *texture = new QGLTexture(q, tx_id, target, options); QGLTextureCache::instance()->insert(q, key, texture, cost); + return texture; } @@ -2521,7 +2520,7 @@ GLuint QGLContext::bindTexture(const QImage &image, GLenum target, GLint format) return 0; Q_D(QGLContext); - QGLTexture *texture = d->bindTexture(image, target, format, false, DefaultBindOption); + QGLTexture *texture = d->bindTexture(image, target, format, DefaultBindOption); return texture->id; } @@ -2661,11 +2660,13 @@ void QGLContext::deleteTexture(GLuint id) for (int i = 0; i < ddsKeys.size(); ++i) { GLuint texture = dds_cache->value(ddsKeys.at(i)); if (id == texture) { - glDeleteTextures(1, &texture); dds_cache->remove(ddsKeys.at(i)); - return; + break; } } + + // Finally, actually delete the texture ID + glDeleteTextures(1, &id); } #ifdef Q_MAC_COMPAT_GL_FUNCTIONS diff --git a/src/opengl/qgl_p.h b/src/opengl/qgl_p.h index 5c4638e..ecd8b43 100644 --- a/src/opengl/qgl_p.h +++ b/src/opengl/qgl_p.h @@ -538,8 +538,8 @@ public: void removeContextTextures(QGLContext *ctx); static QGLTextureCache *instance(); static void deleteIfEmpty(); - static void imageCleanupHook(qint64 cacheKey); - static void cleanupTextures(QPixmapData* pixmap); + static void cleanupTexturesForCacheKey(qint64 cacheKey); + static void cleanupTexturesForPixampData(QPixmapData* pixmap); static void cleanupBeforePixmapDestruction(QPixmapData* pixmap); private: diff --git a/src/opengl/qgl_qws.cpp b/src/opengl/qgl_qws.cpp index d4adc8b..fd17a27 100644 --- a/src/opengl/qgl_qws.cpp +++ b/src/opengl/qgl_qws.cpp @@ -198,11 +198,6 @@ bool QGLContext::chooseContext(const QGLContext* shareContext) // Get the display and initialize it. d->eglContext = new QEglContext(); d->eglContext->setApi(QEgl::OpenGL); - if (!d->eglContext->openDisplay(device())) { - delete d->eglContext; - d->eglContext = 0; - return false; - } // Construct the configuration we need for this surface. QEglProperties configProps; diff --git a/src/opengl/qgl_wince.cpp b/src/opengl/qgl_wince.cpp index 00a125a..f81115c 100644 --- a/src/opengl/qgl_wince.cpp +++ b/src/opengl/qgl_wince.cpp @@ -155,11 +155,6 @@ bool QGLContext::chooseContext(const QGLContext* shareContext) // Get the display and initialize it. d->eglContext = new QEglContext(); d->eglContext->setApi(QEgl::OpenGL); - if (!d->eglContext->openDisplay(device())) { - delete d->eglContext; - d->eglContext = 0; - return false; - } // Construct the configuration we need for this surface. QEglProperties configProps; diff --git a/src/opengl/qgl_x11.cpp b/src/opengl/qgl_x11.cpp index 61a16be..f0b06ef5 100644 --- a/src/opengl/qgl_x11.cpp +++ b/src/opengl/qgl_x11.cpp @@ -1656,8 +1656,11 @@ static bool qt_resolveTextureFromPixmap(QPaintDevice *paintDevice) Display *display = xinfo ? xinfo->display() : X11->display; int screen = xinfo ? xinfo->screen() : X11->defaultScreen; - QGLExtensionMatcher extensions(glXQueryExtensionsString(display, screen)); - if (extensions.match("GLX_EXT_texture_from_pixmap")) { + QGLExtensionMatcher serverExtensions(glXQueryExtensionsString(display, screen)); + QGLExtensionMatcher clientExtensions(glXGetClientString(display, GLX_EXTENSIONS)); + if (serverExtensions.match("GLX_EXT_texture_from_pixmap") + && clientExtensions.match("GLX_EXT_texture_from_pixmap")) + { glXBindTexImageEXT = (qt_glXBindTexImageEXT) qglx_getProcAddress("glXBindTexImageEXT"); glXReleaseTexImageEXT = (qt_glXReleaseTexImageEXT) qglx_getProcAddress("glXReleaseTexImageEXT"); } diff --git a/src/opengl/qgl_x11egl.cpp b/src/opengl/qgl_x11egl.cpp index 572834b..3d183ee 100644 --- a/src/opengl/qgl_x11egl.cpp +++ b/src/opengl/qgl_x11egl.cpp @@ -190,11 +190,6 @@ bool QGLContext::chooseContext(const QGLContext* shareContext) if (d->eglContext == 0) { d->eglContext = new QEglContext(); d->eglContext->setApi(QEgl::OpenGL); - if (!d->eglContext->openDisplay(device())) { - delete d->eglContext; - d->eglContext = 0; - return false; - } // Construct the configuration we need for this surface. QEglProperties configProps; @@ -614,7 +609,7 @@ EGLConfig Q_OPENGL_EXPORT qt_chooseEGLConfigForPixmap(bool hasAlpha, bool readOn EGLint configCount = 0; do { - eglChooseConfig(QEglContext::defaultDisplay(0), configAttribs.properties(), targetConfig, 1, &configCount); + eglChooseConfig(QEglContext::display(), configAttribs.properties(), targetConfig, 1, &configCount); if (configCount > 0) { // Got one qDebug() << "Found an" << (hasAlpha ? "ARGB" : "RGB") << (readOnly ? "readonly" : "target" ) @@ -653,7 +648,7 @@ bool Q_OPENGL_EXPORT qt_createEGLSurfaceForPixmap(QPixmapData* pmd, bool readOnl pixmapAttribs.setValue(EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGB); EGLSurface pixmapSurface; - pixmapSurface = eglCreatePixmapSurface(QEglContext::defaultDisplay(0), + pixmapSurface = eglCreatePixmapSurface(QEglContext::display(), pixmapConfig, (EGLNativePixmapType) pixmapData->handle(), pixmapAttribs.properties()); @@ -762,7 +757,7 @@ void QGLContextPrivate::destroyGlSurfaceForPixmap(QPixmapData* pmd) QX11PixmapData *pixmapData = static_cast<QX11PixmapData*>(pmd); if (pixmapData->gl_surface) { EGLBoolean success; - success = eglDestroySurface(QEglContext::defaultDisplay(0), (EGLSurface)pixmapData->gl_surface); + success = eglDestroySurface(QEglContext::display(), (EGLSurface)pixmapData->gl_surface); if (success == EGL_FALSE) { qWarning() << "destroyGlSurfaceForPixmap() - Error deleting surface: " << QEglContext::errorString(eglGetError()); @@ -777,7 +772,7 @@ void QGLContextPrivate::unbindPixmapFromTexture(QPixmapData* pmd) QX11PixmapData *pixmapData = static_cast<QX11PixmapData*>(pmd); if (pixmapData->gl_surface) { EGLBoolean success; - success = eglReleaseTexImage(QEglContext::defaultDisplay(0), + success = eglReleaseTexImage(QEglContext::display(), (EGLSurface)pixmapData->gl_surface, EGL_BACK_BUFFER); if (success == EGL_FALSE) { diff --git a/src/opengl/qglframebufferobject.cpp b/src/opengl/qglframebufferobject.cpp index 7bebd46..890b029 100644 --- a/src/opengl/qglframebufferobject.cpp +++ b/src/opengl/qglframebufferobject.cpp @@ -325,6 +325,13 @@ void QGLFBOGLPaintDevice::setFBO(QGLFramebufferObject* f, } else if (attachment == QGLFramebufferObject::Depth) { fboFormat.setDepth(true); } + + GLenum format = f->format().internalTextureFormat(); + reqAlpha = (format != GL_RGB +#ifndef QT_OPENGL_ES + && format != GL_RGB5 && format != GL_RGB8 +#endif + ); } QGLContext *QGLFBOGLPaintDevice::context() const diff --git a/src/opengl/qglframebufferobject_p.h b/src/opengl/qglframebufferobject_p.h index d7f96a5..d8ff012 100644 --- a/src/opengl/qglframebufferobject_p.h +++ b/src/opengl/qglframebufferobject_p.h @@ -111,14 +111,16 @@ public: virtual QSize size() const {return fbo->size();} virtual QGLContext* context() const; virtual QGLFormat format() const {return fboFormat;} + virtual bool alphaRequested() const { return reqAlpha; } void setFBO(QGLFramebufferObject* f, QGLFramebufferObject::Attachment attachment); private: - bool wasBound; QGLFramebufferObject* fbo; QGLFormat fboFormat; + bool wasBound; + bool reqAlpha; }; class QGLFramebufferObjectPrivate diff --git a/src/opengl/qglpaintdevice.cpp b/src/opengl/qglpaintdevice.cpp index a0b1a79..2d82222 100644 --- a/src/opengl/qglpaintdevice.cpp +++ b/src/opengl/qglpaintdevice.cpp @@ -124,6 +124,11 @@ QGLFormat QGLPaintDevice::format() const return context()->format(); } +bool QGLPaintDevice::alphaRequested() const +{ + return context()->d_func()->reqFormat.alpha(); +} + diff --git a/src/opengl/qglpaintdevice_p.h b/src/opengl/qglpaintdevice_p.h index 9815467..3d669da 100644 --- a/src/opengl/qglpaintdevice_p.h +++ b/src/opengl/qglpaintdevice_p.h @@ -75,6 +75,7 @@ public: virtual QGLContext* context() const = 0; virtual QGLFormat format() const; virtual QSize size() const = 0; + virtual bool alphaRequested() const; // returns the QGLPaintDevice for the given QPaintDevice static QGLPaintDevice* getDevice(QPaintDevice*); diff --git a/src/opengl/qglpixelbuffer_egl.cpp b/src/opengl/qglpixelbuffer_egl.cpp index 1e3223e..954049d 100644 --- a/src/opengl/qglpixelbuffer_egl.cpp +++ b/src/opengl/qglpixelbuffer_egl.cpp @@ -61,13 +61,6 @@ bool QGLPixelBufferPrivate::init(const QSize &size, const QGLFormat &f, QGLWidge ctx = new QEglContext(); ctx->setApi(QEgl::OpenGL); - // Open the EGL display. - if (!ctx->openDisplay(0)) { - delete ctx; - ctx = 0; - return false; - } - // Find the shared context. QEglContext *shareContext = 0; if (shareWidget && shareWidget->d_func()->glcx) @@ -211,7 +204,7 @@ GLuint QGLPixelBuffer::generateDynamicTexture() const bool QGLPixelBuffer::hasOpenGLPbuffers() { // See if we have at least 1 configuration that matches the default format. - EGLDisplay dpy = QEglContext::defaultDisplay(0); + EGLDisplay dpy = QEglContext::display(); if (dpy == EGL_NO_DISPLAY) return false; QEglProperties configProps; diff --git a/src/opengl/qpixmapdata_gl.cpp b/src/opengl/qpixmapdata_gl.cpp index aa80664..653e805 100644 --- a/src/opengl/qpixmapdata_gl.cpp +++ b/src/opengl/qpixmapdata_gl.cpp @@ -234,6 +234,11 @@ QSize QGLPixmapGLPaintDevice::size() const return data->size(); } +bool QGLPixmapGLPaintDevice::alphaRequested() const +{ + return data->m_hasAlpha; +} + void QGLPixmapGLPaintDevice::setPixmapData(QGLPixmapData* d) { data = d; diff --git a/src/opengl/qpixmapdata_gl_p.h b/src/opengl/qpixmapdata_gl_p.h index e3ba5f8..c239bcb 100644 --- a/src/opengl/qpixmapdata_gl_p.h +++ b/src/opengl/qpixmapdata_gl_p.h @@ -88,6 +88,7 @@ public: void endPaint(); QGLContext* context() const; QSize size() const; + bool alphaRequested() const; void setPixmapData(QGLPixmapData*); private: diff --git a/src/opengl/qpixmapdata_x11gl_egl.cpp b/src/opengl/qpixmapdata_x11gl_egl.cpp index edce56a..6a1d030 100644 --- a/src/opengl/qpixmapdata_x11gl_egl.cpp +++ b/src/opengl/qpixmapdata_x11gl_egl.cpp @@ -96,14 +96,14 @@ bool QX11GLPixmapData::hasX11GLPixmaps() #endif EGL_NONE }; - qPixmapARGBSharedEglContext = eglCreateContext(QEglContext::defaultDisplay(0), + qPixmapARGBSharedEglContext = eglCreateContext(QEglContext::display(), argbConfig, 0, contextAttribs); if (argbConfig == rgbConfig) { // If the configs are the same, we can re-use the same context. qPixmapRGBSharedEglContext = qPixmapARGBSharedEglContext; } else { - qPixmapRGBSharedEglContext = eglCreateContext(QEglContext::defaultDisplay(0), + qPixmapRGBSharedEglContext = eglCreateContext(QEglContext::display(), rgbConfig, 0, contextAttribs); } @@ -114,7 +114,7 @@ bool QX11GLPixmapData::hasX11GLPixmaps() if (!qt_createEGLSurfaceForPixmap(argbPixmapData, false)) break; - haveX11Pixmaps = eglMakeCurrent(QEglContext::defaultDisplay(0), + haveX11Pixmaps = eglMakeCurrent(QEglContext::display(), (EGLSurface)argbPixmapData->gl_surface, (EGLSurface)argbPixmapData->gl_surface, qPixmapARGBSharedEglContext); @@ -134,7 +134,7 @@ bool QX11GLPixmapData::hasX11GLPixmaps() if (!qt_createEGLSurfaceForPixmap(rgbPixmapData, false)) break; - haveX11Pixmaps = eglMakeCurrent(QEglContext::defaultDisplay(0), + haveX11Pixmaps = eglMakeCurrent(QEglContext::display(), (EGLSurface)rgbPixmapData->gl_surface, (EGLSurface)rgbPixmapData->gl_surface, qPixmapRGBSharedEglContext); @@ -147,7 +147,7 @@ bool QX11GLPixmapData::hasX11GLPixmaps() } while (0); if (qPixmapARGBSharedEglContext || qPixmapRGBSharedEglContext) { - eglMakeCurrent(QEglContext::defaultDisplay(0), + eglMakeCurrent(QEglContext::display(), EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); } @@ -167,12 +167,12 @@ bool QX11GLPixmapData::hasX11GLPixmaps() if (!haveX11Pixmaps) { // Clean up the context(s) if we can't use X11GL pixmaps if (qPixmapARGBSharedEglContext != EGL_NO_CONTEXT) - eglDestroyContext(QEglContext::defaultDisplay(0), qPixmapARGBSharedEglContext); + eglDestroyContext(QEglContext::display(), qPixmapARGBSharedEglContext); if (qPixmapRGBSharedEglContext != qPixmapARGBSharedEglContext && qPixmapRGBSharedEglContext != EGL_NO_CONTEXT) { - eglDestroyContext(QEglContext::defaultDisplay(0), qPixmapRGBSharedEglContext); + eglDestroyContext(QEglContext::display(), qPixmapRGBSharedEglContext); } qPixmapRGBSharedEglContext = EGL_NO_CONTEXT; qPixmapARGBSharedEglContext = EGL_NO_CONTEXT; @@ -212,7 +212,6 @@ QPaintEngine* QX11GLPixmapData::paintEngine() const ctx = new QGLContext(glFormat()); if (ctx->d_func()->eglContext == 0) ctx->d_func()->eglContext = new QEglContext(); - ctx->d_func()->eglContext->openDisplay(0); // ;-) ctx->d_func()->eglContext->setApi(QEgl::OpenGL); ctx->d_func()->eglContext->setContext(hasAlphaChannel() ? qPixmapARGBSharedEglContext : qPixmapRGBSharedEglContext); diff --git a/src/openvg/qwindowsurface_vgegl.cpp b/src/openvg/qwindowsurface_vgegl.cpp index d92870f..9c44545 100644 --- a/src/openvg/qwindowsurface_vgegl.cpp +++ b/src/openvg/qwindowsurface_vgegl.cpp @@ -225,10 +225,6 @@ static QEglContext *createContext(QPaintDevice *device) // Create the context object and open the display. context = new QEglContext(); context->setApi(QEgl::OpenVG); - if (!context->openDisplay(device)) { - delete context; - return 0; - } // Set the swap interval for the display. QByteArray interval = qgetenv("QT_VG_SWAP_INTERVAL"); diff --git a/src/plugins/audio/audio.pro b/src/plugins/audio/audio.pro index e93b369..5f75a8d 100644 --- a/src/plugins/audio/audio.pro +++ b/src/plugins/audio/audio.pro @@ -1,3 +1,9 @@ TEMPLATE = subdirs +SUBDIRS = + +contains(QT_CONFIG, audio-backend) { + symbian { + SUBDIRS += symbian + } +} -#SUBDIRS += ossaudio diff --git a/src/plugins/audio/symbian/main.cpp b/src/plugins/audio/symbian/main.cpp new file mode 100644 index 0000000..536a8ec --- /dev/null +++ b/src/plugins/audio/symbian/main.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 QtMultimedia module 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 <QtMultimedia/qaudioengineplugin.h> +#include <QtMultimedia/qaudioengine.h> + +#include <qstringlist.h> +#include <qiodevice.h> +#include <qbytearray.h> +#include <qdebug.h> + +#include "symbianaudiodeviceinfo.h" +#include "symbianaudioinput.h" +#include "symbianaudiooutput.h" + +QT_BEGIN_NAMESPACE + +class SymbianAudioPlugin : public QAudioEnginePlugin +{ +public: + SymbianAudioPlugin(QObject *parent = 0); + ~SymbianAudioPlugin(); + + QStringList keys() const; + + QList<QByteArray> availableDevices(QAudio::Mode) const; + QAbstractAudioInput* createInput(const QByteArray& device, + const QAudioFormat& format = QAudioFormat()); + QAbstractAudioOutput* createOutput(const QByteArray& device, + const QAudioFormat& format = QAudioFormat()); + QAbstractAudioDeviceInfo* createDeviceInfo(const QByteArray& device, + QAudio::Mode mode); +}; + +SymbianAudioPlugin::SymbianAudioPlugin(QObject *parent) + : QAudioEnginePlugin(parent) +{ + +} + +SymbianAudioPlugin::~SymbianAudioPlugin() +{ + +} + +QStringList SymbianAudioPlugin::keys() const +{ + QStringList keys(QLatin1String("default")); + keys << QLatin1String("default"); + return keys; +} + +QList<QByteArray> SymbianAudioPlugin::availableDevices(QAudio::Mode mode) const +{ + Q_UNUSED(mode) + QList<QByteArray> devices; + devices.append("default"); + return devices; +} + +QAbstractAudioInput* SymbianAudioPlugin::createInput( + const QByteArray &device, const QAudioFormat &format) +{ + return new SymbianAudioInput(device, format); +} + +QAbstractAudioOutput* SymbianAudioPlugin::createOutput( + const QByteArray &device, const QAudioFormat &format) +{ + return new SymbianAudioOutput(device, format); +} + +QAbstractAudioDeviceInfo* SymbianAudioPlugin::createDeviceInfo( + const QByteArray& device, QAudio::Mode mode) +{ + return new SymbianAudioDeviceInfo(device, mode); +} + +Q_EXPORT_STATIC_PLUGIN(SymbianAudioPlugin) +Q_EXPORT_PLUGIN2(qaudio, SymbianAudioPlugin) + +QT_END_NAMESPACE + diff --git a/src/plugins/audio/symbian/symbian.pro b/src/plugins/audio/symbian/symbian.pro new file mode 100644 index 0000000..7355daa --- /dev/null +++ b/src/plugins/audio/symbian/symbian.pro @@ -0,0 +1,31 @@ +QT += multimedia +TARGET = qaudio + +# Paths to DevSound headers +INCLUDEPATH += /epoc32/include/mmf/common +INCLUDEPATH += /epoc32/include/mmf/server + +HEADERS += \ + symbianaudio.h \ + symbianaudiodeviceinfo.h \ + symbianaudioinput.h \ + symbianaudiooutput.h \ + symbianaudioutils.h + +SOURCES += \ + main.cpp \ + symbianaudiodeviceinfo.cpp \ + symbianaudioinput.cpp \ + symbianaudiooutput.cpp \ + symbianaudioutils.cpp + +LIBS += -lmmfdevsound + +QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/audio +target.path = $$[QT_INSTALL_PLUGINS]/audio +INSTALLS += target + +include(../../qpluginbase.pri) + +TARGET.UID3 = 0x2001E630 + diff --git a/src/plugins/audio/symbian/symbianaudio.h b/src/plugins/audio/symbian/symbianaudio.h new file mode 100644 index 0000000..3fc0419 --- /dev/null +++ b/src/plugins/audio/symbian/symbianaudio.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 QtMultimedia module 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 SYMBIANAUDIO_H +#define SYMBIANAUDIO_H + +#include <QtCore/qnamespace.h> + +QT_BEGIN_NAMESPACE + +namespace SymbianAudio { + +/** + * Default values used by audio input and output classes, when underlying + * DevSound instance has not yet been created. + */ + +const int DefaultBufferSize = 4096; // bytes +const int DefaultNotifyInterval = 1000; // ms + +/** + * Enumeration used to track state of internal DevSound instances. + * Values are translated to the corresponding QAudio::State values by + * SymbianAudio::Utils::stateNativeToQt. + */ +enum State { + ClosedState + , InitializingState + , ActiveState + , IdleState + , SuspendedState +}; + +} // namespace SymbianAudio + +QT_END_NAMESPACE + +#endif diff --git a/src/plugins/audio/symbian/symbianaudiodeviceinfo.cpp b/src/plugins/audio/symbian/symbianaudiodeviceinfo.cpp new file mode 100644 index 0000000..9701dad --- /dev/null +++ b/src/plugins/audio/symbian/symbianaudiodeviceinfo.cpp @@ -0,0 +1,191 @@ +/**************************************************************************** +** +** 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 QtMultimedia module 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 "symbianaudiodeviceinfo.h" +#include "symbianaudioutils.h" + +QT_BEGIN_NAMESPACE + +SymbianAudioDeviceInfo::SymbianAudioDeviceInfo(QByteArray device, + QAudio::Mode mode) + : m_deviceName(device) + , m_mode(mode) + , m_updated(false) +{ + QT_TRAP_THROWING(m_devsound.reset(CMMFDevSound::NewL())); +} + +SymbianAudioDeviceInfo::~SymbianAudioDeviceInfo() +{ + +} + +QAudioFormat SymbianAudioDeviceInfo::preferredFormat() const +{ + QAudioFormat format; + switch (m_mode) { + case QAudio::AudioOutput: + format.setFrequency(44100); + format.setChannels(2); + format.setSampleSize(16); + format.setByteOrder(QAudioFormat::LittleEndian); + format.setSampleType(QAudioFormat::SignedInt); + format.setCodec(QLatin1String("audio/pcm")); + break; + + case QAudio::AudioInput: + format.setFrequency(8000); + format.setChannels(1); + format.setSampleSize(16); + format.setByteOrder(QAudioFormat::LittleEndian); + format.setSampleType(QAudioFormat::SignedInt); + format.setCodec(QLatin1String("audio/pcm")); + break; + + default: + Q_ASSERT_X(false, Q_FUNC_INFO, "Invalid mode"); + } + + if (!isFormatSupported(format)) { + if (m_frequencies.size()) + format.setFrequency(m_frequencies[0]); + if (m_channels.size()) + format.setChannels(m_channels[0]); + if (m_sampleSizes.size()) + format.setSampleSize(m_sampleSizes[0]); + if (m_byteOrders.size()) + format.setByteOrder(m_byteOrders[0]); + if (m_sampleTypes.size()) + format.setSampleType(m_sampleTypes[0]); + } + + return format; +} + +bool SymbianAudioDeviceInfo::isFormatSupported( + const QAudioFormat &format) const +{ + getSupportedFormats(); + const bool supported = + m_codecs.contains(format.codec()) + && m_frequencies.contains(format.frequency()) + && m_channels.contains(format.channels()) + && m_sampleSizes.contains(format.sampleSize()) + && m_byteOrders.contains(format.byteOrder()) + && m_sampleTypes.contains(format.sampleType()); + + return supported; +} + +QAudioFormat SymbianAudioDeviceInfo::nearestFormat(const QAudioFormat &format) const +{ + if (isFormatSupported(format)) + return format; + else + return preferredFormat(); +} + +QString SymbianAudioDeviceInfo::deviceName() const +{ + return m_deviceName; +} + +QStringList SymbianAudioDeviceInfo::codecList() +{ + getSupportedFormats(); + return m_codecs; +} + +QList<int> SymbianAudioDeviceInfo::frequencyList() +{ + getSupportedFormats(); + return m_frequencies; +} + +QList<int> SymbianAudioDeviceInfo::channelsList() +{ + getSupportedFormats(); + return m_channels; +} + +QList<int> SymbianAudioDeviceInfo::sampleSizeList() +{ + getSupportedFormats(); + return m_sampleSizes; +} + +QList<QAudioFormat::Endian> SymbianAudioDeviceInfo::byteOrderList() +{ + getSupportedFormats(); + return m_byteOrders; +} + +QList<QAudioFormat::SampleType> SymbianAudioDeviceInfo::sampleTypeList() +{ + getSupportedFormats(); + return m_sampleTypes; +} + +QList<QByteArray> SymbianAudioDeviceInfo::deviceList(QAudio::Mode mode) +{ + Q_UNUSED(mode) + QList<QByteArray> devices; + devices.append("default"); + return devices; +} + +void SymbianAudioDeviceInfo::getSupportedFormats() const +{ + if (!m_updated) { + QScopedPointer<SymbianAudio::DevSoundCapabilities> caps( + new SymbianAudio::DevSoundCapabilities(*m_devsound, m_mode)); + + SymbianAudio::Utils::capabilitiesNativeToQt(*caps, + m_frequencies, m_channels, m_sampleSizes, + m_byteOrders, m_sampleTypes); + + m_codecs.append(QLatin1String("audio/pcm")); + + m_updated = true; + } +} + +QT_END_NAMESPACE diff --git a/src/plugins/audio/symbian/symbianaudiodeviceinfo.h b/src/plugins/audio/symbian/symbianaudiodeviceinfo.h new file mode 100644 index 0000000..250804d --- /dev/null +++ b/src/plugins/audio/symbian/symbianaudiodeviceinfo.h @@ -0,0 +1,94 @@ +/**************************************************************************** +** +** 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 QtMultimedia module 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 SYMBIANAUDIODEVICEINFO_H +#define SYMBIANAUDIODEVICEINFO_H + +#include <QtMultimedia/qaudioengine.h> +#include <sounddevice.h> + +QT_BEGIN_NAMESPACE + +class SymbianAudioDeviceInfo + : public QAbstractAudioDeviceInfo +{ + Q_OBJECT + +public: + SymbianAudioDeviceInfo(QByteArray device, QAudio::Mode mode); + ~SymbianAudioDeviceInfo(); + + // QAbstractAudioDeviceInfo + QAudioFormat preferredFormat() const; + bool isFormatSupported(const QAudioFormat &format) const; + QAudioFormat nearestFormat(const QAudioFormat &format) const; + QString deviceName() const; + QStringList codecList(); + QList<int> frequencyList(); + QList<int> channelsList(); + QList<int> sampleSizeList(); + QList<QAudioFormat::Endian> byteOrderList(); + QList<QAudioFormat::SampleType> sampleTypeList(); + QList<QByteArray> deviceList(QAudio::Mode); + +private: + void getSupportedFormats() const; + +private: + QScopedPointer<CMMFDevSound> m_devsound; + + QString m_deviceName; + QAudio::Mode m_mode; + + // Mutable to allow lazy initialization when called from const-qualified + // public functions (isFormatSupported, nearestFormat) + mutable bool m_updated; + mutable QStringList m_codecs; + mutable QList<int> m_frequencies; + mutable QList<int> m_channels; + mutable QList<int> m_sampleSizes; + mutable QList<QAudioFormat::Endian> m_byteOrders; + mutable QList<QAudioFormat::SampleType> m_sampleTypes; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/plugins/audio/symbian/symbianaudioinput.cpp b/src/plugins/audio/symbian/symbianaudioinput.cpp new file mode 100644 index 0000000..8200925 --- /dev/null +++ b/src/plugins/audio/symbian/symbianaudioinput.cpp @@ -0,0 +1,595 @@ +/**************************************************************************** +** +** 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 QtMultimedia module 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 "symbianaudioinput.h" +#include "symbianaudioutils.h" + +QT_BEGIN_NAMESPACE + +//----------------------------------------------------------------------------- +// Constants +//----------------------------------------------------------------------------- + +const int PushInterval = 50; // ms + + +//----------------------------------------------------------------------------- +// Private class +//----------------------------------------------------------------------------- + +SymbianAudioInputPrivate::SymbianAudioInputPrivate( + SymbianAudioInput *audioDevice) + : m_audioDevice(audioDevice) +{ + +} + +SymbianAudioInputPrivate::~SymbianAudioInputPrivate() +{ + +} + +qint64 SymbianAudioInputPrivate::readData(char *data, qint64 len) +{ + qint64 totalRead = 0; + + if (m_audioDevice->state() == QAudio::ActiveState || + m_audioDevice->state() == QAudio::IdleState) { + + while (totalRead < len) { + const qint64 read = m_audioDevice->read(data + totalRead, + len - totalRead); + if (read > 0) + totalRead += read; + else + break; + } + } + + return totalRead; +} + +qint64 SymbianAudioInputPrivate::writeData(const char *data, qint64 len) +{ + Q_UNUSED(data) + Q_UNUSED(len) + return 0; +} + +void SymbianAudioInputPrivate::dataReady() +{ + emit readyRead(); +} + + +//----------------------------------------------------------------------------- +// Public functions +//----------------------------------------------------------------------------- + +SymbianAudioInput::SymbianAudioInput(const QByteArray &device, + const QAudioFormat &format) + : m_device(device) + , m_format(format) + , m_clientBufferSize(SymbianAudio::DefaultBufferSize) + , m_notifyInterval(SymbianAudio::DefaultNotifyInterval) + , m_notifyTimer(new QTimer(this)) + , m_error(QAudio::NoError) + , m_internalState(SymbianAudio::ClosedState) + , m_externalState(QAudio::StoppedState) + , m_pullMode(false) + , m_sink(0) + , m_pullTimer(new QTimer(this)) + , m_devSoundBuffer(0) + , m_devSoundBufferSize(0) + , m_totalBytesReady(0) + , m_devSoundBufferPos(0) + , m_totalSamplesRecorded(0) +{ + connect(m_notifyTimer.data(), SIGNAL(timeout()), this, SIGNAL(notify())); + + SymbianAudio::Utils::formatQtToNative(m_format, m_nativeFourCC, + m_nativeFormat); + + m_pullTimer->setInterval(PushInterval); + connect(m_pullTimer.data(), SIGNAL(timeout()), this, SLOT(pullData())); +} + +SymbianAudioInput::~SymbianAudioInput() +{ + close(); +} + +QIODevice* SymbianAudioInput::start(QIODevice *device) +{ + stop(); + + open(); + if (SymbianAudio::ClosedState != m_internalState) { + if (device) { + m_pullMode = true; + m_sink = device; + } else { + m_sink = new SymbianAudioInputPrivate(this); + m_sink->open(QIODevice::ReadOnly | QIODevice::Unbuffered); + } + + m_elapsed.restart(); + } + + return m_sink; +} + +void SymbianAudioInput::stop() +{ + close(); +} + +void SymbianAudioInput::reset() +{ + m_totalSamplesRecorded += getSamplesRecorded(); + m_devSound->Stop(); + startRecording(); +} + +void SymbianAudioInput::suspend() +{ + if (SymbianAudio::ActiveState == m_internalState + || SymbianAudio::IdleState == m_internalState) { + m_notifyTimer->stop(); + m_pullTimer->stop(); + m_devSound->Pause(); + const qint64 samplesRecorded = getSamplesRecorded(); + m_totalSamplesRecorded += samplesRecorded; + + if (m_devSoundBuffer) { + m_devSoundBufferQ.append(m_devSoundBuffer); + m_devSoundBuffer = 0; + } + + setState(SymbianAudio::SuspendedState); + } +} + +void SymbianAudioInput::resume() +{ + if (SymbianAudio::SuspendedState == m_internalState) + startDataTransfer(); +} + +int SymbianAudioInput::bytesReady() const +{ + Q_ASSERT(m_devSoundBufferPos <= m_totalBytesReady); + return m_totalBytesReady - m_devSoundBufferPos; +} + +int SymbianAudioInput::periodSize() const +{ + return bufferSize(); +} + +void SymbianAudioInput::setBufferSize(int value) +{ + // Note that DevSound does not allow its client to specify the buffer size. + // This functionality is available via custom interfaces, but since these + // cannot be guaranteed to work across all DevSound implementations, we + // do not use them here. + // In order to comply with the expected bevahiour of QAudioInput, we store + // the value and return it from bufferSize(), but the underlying DevSound + // buffer size remains unchanged. + if (value > 0) + m_clientBufferSize = value; +} + +int SymbianAudioInput::bufferSize() const +{ + return m_devSoundBufferSize ? m_devSoundBufferSize : m_clientBufferSize; +} + +void SymbianAudioInput::setNotifyInterval(int ms) +{ + if (ms > 0) { + const int oldNotifyInterval = m_notifyInterval; + m_notifyInterval = ms; + if (m_notifyTimer->isActive() && ms != oldNotifyInterval) + m_notifyTimer->start(m_notifyInterval); + } +} + +int SymbianAudioInput::notifyInterval() const +{ + return m_notifyInterval; +} + +qint64 SymbianAudioInput::processedUSecs() const +{ + int samplesPlayed = 0; + if (m_devSound && SymbianAudio::SuspendedState != m_internalState) + samplesPlayed = getSamplesRecorded(); + + // Protect against division by zero + Q_ASSERT_X(m_format.frequency() > 0, Q_FUNC_INFO, "Invalid frequency"); + + const qint64 result = qint64(1000000) * + (samplesPlayed + m_totalSamplesRecorded) + / m_format.frequency(); + + return result; +} + +qint64 SymbianAudioInput::elapsedUSecs() const +{ + const qint64 result = (QAudio::StoppedState == state()) ? + 0 : m_elapsed.elapsed() * 1000; + return result; +} + +QAudio::Error SymbianAudioInput::error() const +{ + return m_error; +} + +QAudio::State SymbianAudioInput::state() const +{ + return m_externalState; +} + +QAudioFormat SymbianAudioInput::format() const +{ + return m_format; +} + +//----------------------------------------------------------------------------- +// MDevSoundObserver implementation +//----------------------------------------------------------------------------- + +void SymbianAudioInput::InitializeComplete(TInt aError) +{ + Q_ASSERT_X(SymbianAudio::InitializingState == m_internalState, + Q_FUNC_INFO, "Invalid state"); + + if (KErrNone == aError) + startRecording(); +} + +void SymbianAudioInput::ToneFinished(TInt aError) +{ + Q_UNUSED(aError) + // This class doesn't use DevSound's tone playback functions, so should + // never receive this callback. + Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback"); +} + +void SymbianAudioInput::BufferToBeFilled(CMMFBuffer *aBuffer) +{ + Q_UNUSED(aBuffer) + // This class doesn't use DevSound in play mode, so should never receive + // this callback. + Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback"); +} + +void SymbianAudioInput::PlayError(TInt aError) +{ + Q_UNUSED(aError) + // This class doesn't use DevSound in play mode, so should never receive + // this callback. + Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback"); +} + +void SymbianAudioInput::BufferToBeEmptied(CMMFBuffer *aBuffer) +{ + // Following receipt of this callback, DevSound should not provide another + // buffer until we have returned the current one. + Q_ASSERT_X(!m_devSoundBuffer, Q_FUNC_INFO, "Buffer already held"); + + CMMFDataBuffer *const buffer = static_cast<CMMFDataBuffer*>(aBuffer); + + if (!m_devSoundBufferSize) + m_devSoundBufferSize = buffer->Data().MaxLength(); + + m_totalBytesReady += buffer->Data().Length(); + + if (SymbianAudio::SuspendedState == m_internalState) { + m_devSoundBufferQ.append(buffer); + } else { + // Will be returned to DevSound by bufferEmptied(). + m_devSoundBuffer = buffer; + m_devSoundBufferPos = 0; + + if (bytesReady() && !m_pullMode) + pushData(); + } +} + +void SymbianAudioInput::RecordError(TInt aError) +{ + Q_UNUSED(aError) + setError(QAudio::IOError); +} + +void SymbianAudioInput::ConvertError(TInt aError) +{ + Q_UNUSED(aError) + // This class doesn't use DevSound's format conversion functions, so + // should never receive this callback. + Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback"); +} + +void SymbianAudioInput::DeviceMessage(TUid aMessageType, const TDesC8 &aMsg) +{ + Q_UNUSED(aMessageType) + Q_UNUSED(aMsg) + // Ignore this callback. +} + +//----------------------------------------------------------------------------- +// Private functions +//----------------------------------------------------------------------------- + +void SymbianAudioInput::open() +{ + Q_ASSERT_X(SymbianAudio::ClosedState == m_internalState, + Q_FUNC_INFO, "DevSound already opened"); + + QT_TRAP_THROWING( m_devSound.reset(CMMFDevSound::NewL()) ) + + QScopedPointer<SymbianAudio::DevSoundCapabilities> caps( + new SymbianAudio::DevSoundCapabilities(*m_devSound, QAudio::AudioInput)); + + int err = SymbianAudio::Utils::isFormatSupported(m_format, *caps) ? + KErrNone : KErrNotSupported; + + if (KErrNone == err) { + setState(SymbianAudio::InitializingState); + TRAP(err, m_devSound->InitializeL(*this, m_nativeFourCC, + EMMFStateRecording)); + } + + if (KErrNone != err) { + setError(QAudio::OpenError); + m_devSound.reset(); + } +} + +void SymbianAudioInput::startRecording() +{ + const int samplesRecorded = m_devSound->SamplesRecorded(); + Q_ASSERT(samplesRecorded == 0); + + TRAPD(err, startDevSoundL()); + if (KErrNone == err) { + startDataTransfer(); + } else { + setError(QAudio::OpenError); + close(); + } +} + +void SymbianAudioInput::startDevSoundL() +{ + TMMFCapabilities nativeFormat = m_devSound->Config(); + m_nativeFormat.iBufferSize = nativeFormat.iBufferSize; + m_devSound->SetConfigL(m_nativeFormat); + m_devSound->RecordInitL(); +} + +void SymbianAudioInput::startDataTransfer() +{ + m_notifyTimer->start(m_notifyInterval); + + if (m_pullMode) + m_pullTimer->start(); + + if (bytesReady()) { + setState(SymbianAudio::ActiveState); + if (!m_pullMode) + pushData(); + } else { + if (SymbianAudio::SuspendedState == m_internalState) + setState(SymbianAudio::ActiveState); + else + setState(SymbianAudio::IdleState); + } +} + +CMMFDataBuffer* SymbianAudioInput::currentBuffer() const +{ + CMMFDataBuffer *result = m_devSoundBuffer; + if (!result && !m_devSoundBufferQ.empty()) + result = m_devSoundBufferQ.front(); + return result; +} + +void SymbianAudioInput::pushData() +{ + Q_ASSERT_X(bytesReady(), Q_FUNC_INFO, "No data available"); + Q_ASSERT_X(!m_pullMode, Q_FUNC_INFO, "pushData called when in pull mode"); + qobject_cast<SymbianAudioInputPrivate *>(m_sink)->dataReady(); +} + +qint64 SymbianAudioInput::read(char *data, qint64 len) +{ + // SymbianAudioInputPrivate is ready to read data + + Q_ASSERT_X(!m_pullMode, Q_FUNC_INFO, + "read called when in pull mode"); + + qint64 bytesRead = 0; + + CMMFDataBuffer *buffer = 0; + while ((buffer = currentBuffer()) && (bytesRead < len)) { + if (SymbianAudio::IdleState == m_internalState) + setState(SymbianAudio::ActiveState); + + TDesC8 &inputBuffer = buffer->Data(); + + const qint64 inputBytes = bytesReady(); + const qint64 outputBytes = len - bytesRead; + const qint64 copyBytes = outputBytes < inputBytes ? + outputBytes : inputBytes; + + memcpy(data, inputBuffer.Ptr() + m_devSoundBufferPos, copyBytes); + + m_devSoundBufferPos += copyBytes; + data += copyBytes; + bytesRead += copyBytes; + + if (!bytesReady()) + bufferEmptied(); + } + + return bytesRead; +} + +void SymbianAudioInput::pullData() +{ + Q_ASSERT_X(m_pullMode, Q_FUNC_INFO, + "pullData called when in push mode"); + + CMMFDataBuffer *buffer = 0; + while (buffer = currentBuffer()) { + if (SymbianAudio::IdleState == m_internalState) + setState(SymbianAudio::ActiveState); + + TDesC8 &inputBuffer = buffer->Data(); + + const qint64 inputBytes = bytesReady(); + const qint64 bytesPushed = m_sink->write( + (char*)inputBuffer.Ptr() + m_devSoundBufferPos, inputBytes); + + m_devSoundBufferPos += bytesPushed; + + if (!bytesReady()) + bufferEmptied(); + + if (!bytesPushed) + break; + } +} + +void SymbianAudioInput::bufferEmptied() +{ + m_devSoundBufferPos = 0; + + if (m_devSoundBuffer) { + m_totalBytesReady -= m_devSoundBuffer->Data().Length(); + m_devSoundBuffer = 0; + m_devSound->RecordData(); + } else { + Q_ASSERT(!m_devSoundBufferQ.empty()); + m_totalBytesReady -= m_devSoundBufferQ.front()->Data().Length(); + m_devSoundBufferQ.erase(m_devSoundBufferQ.begin()); + + // If the queue has been emptied, resume transfer from the hardware + if (m_devSoundBufferQ.empty()) + m_devSound->RecordInitL(); + } + + Q_ASSERT(m_totalBytesReady >= 0); +} + +void SymbianAudioInput::close() +{ + m_notifyTimer->stop(); + m_pullTimer->stop(); + + m_error = QAudio::NoError; + + if (m_devSound) + m_devSound->Stop(); + m_devSound.reset(); + m_devSoundBuffer = 0; + m_devSoundBufferSize = 0; + m_totalBytesReady = 0; + + if (!m_pullMode) // m_sink is owned + delete m_sink; + m_pullMode = false; + m_sink = 0; + + m_devSoundBufferQ.clear(); + m_devSoundBufferPos = 0; + m_totalSamplesRecorded = 0; + + setState(SymbianAudio::ClosedState); +} + +qint64 SymbianAudioInput::getSamplesRecorded() const +{ + qint64 result = 0; + if (m_devSound) + result = qint64(m_devSound->SamplesRecorded()); + return result; +} + +void SymbianAudioInput::setError(QAudio::Error error) +{ + m_error = error; + + // Although no state transition actually occurs here, a stateChanged event + // must be emitted to inform the client that the call to start() was + // unsuccessful. + if (QAudio::OpenError == error) + emit stateChanged(QAudio::StoppedState); + + // Close the DevSound instance. This causes a transition to StoppedState. + // This must be done asynchronously in case the current function was called + // from a DevSound event handler, in which case deleting the DevSound + // instance may cause an exception. + QMetaObject::invokeMethod(this, "close", Qt::QueuedConnection); +} + +void SymbianAudioInput::setState(SymbianAudio::State newInternalState) +{ + const QAudio::State oldExternalState = m_externalState; + m_internalState = newInternalState; + m_externalState = SymbianAudio::Utils::stateNativeToQt( + m_internalState, initializingState()); + + if (m_externalState != oldExternalState) + emit stateChanged(m_externalState); +} + +QAudio::State SymbianAudioInput::initializingState() const +{ + return QAudio::IdleState; +} + +QT_END_NAMESPACE diff --git a/src/plugins/audio/symbian/symbianaudioinput.h b/src/plugins/audio/symbian/symbianaudioinput.h new file mode 100644 index 0000000..34b7d38 --- /dev/null +++ b/src/plugins/audio/symbian/symbianaudioinput.h @@ -0,0 +1,177 @@ +/**************************************************************************** +** +** 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 QtMultimedia module 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 SYMBIANAUDIOINPUT_H +#define SYMBIANAUDIOINPUT_H + +#include <QtMultimedia/qaudioengine.h> +#include <QTime> +#include <QTimer> +#include <sounddevice.h> +#include "symbianaudio.h" + +QT_BEGIN_NAMESPACE + +class SymbianAudioInput; + +class SymbianAudioInputPrivate : public QIODevice +{ + friend class SymbianAudioInput; + Q_OBJECT +public: + SymbianAudioInputPrivate(SymbianAudioInput *audio); + ~SymbianAudioInputPrivate(); + + qint64 readData(char *data, qint64 len); + qint64 writeData(const char *data, qint64 len); + + void dataReady(); + +private: + SymbianAudioInput *const m_audioDevice; +}; + +class SymbianAudioInput + : public QAbstractAudioInput + , public MDevSoundObserver +{ + friend class SymbianAudioInputPrivate; + Q_OBJECT +public: + SymbianAudioInput(const QByteArray &device, + const QAudioFormat &audioFormat); + ~SymbianAudioInput(); + + // QAbstractAudioInput + QIODevice* start(QIODevice *device = 0); + void stop(); + void reset(); + void suspend(); + void resume(); + int bytesReady() const; + int periodSize() const; + void setBufferSize(int value); + int bufferSize() const; + void setNotifyInterval(int milliSeconds); + int notifyInterval() const; + qint64 processedUSecs() const; + qint64 elapsedUSecs() const; + QAudio::Error error() const; + QAudio::State state() const; + QAudioFormat format() const; + + // MDevSoundObserver + void InitializeComplete(TInt aError); + void ToneFinished(TInt aError); + void BufferToBeFilled(CMMFBuffer *aBuffer); + void PlayError(TInt aError); + void BufferToBeEmptied(CMMFBuffer *aBuffer); + void RecordError(TInt aError); + void ConvertError(TInt aError); + void DeviceMessage(TUid aMessageType, const TDesC8 &aMsg); + +private slots: + void pullData(); + +private: + void open(); + void startRecording(); + void startDevSoundL(); + void startDataTransfer(); + CMMFDataBuffer* currentBuffer() const; + void pushData(); + qint64 read(char *data, qint64 len); + void bufferEmptied(); + Q_INVOKABLE void close(); + + qint64 getSamplesRecorded() const; + + void setError(QAudio::Error error); + void setState(SymbianAudio::State state); + + QAudio::State initializingState() const; + +private: + const QByteArray m_device; + const QAudioFormat m_format; + + int m_clientBufferSize; + int m_notifyInterval; + QScopedPointer<QTimer> m_notifyTimer; + QTime m_elapsed; + QAudio::Error m_error; + + SymbianAudio::State m_internalState; + QAudio::State m_externalState; + + bool m_pullMode; + QIODevice *m_sink; + + QScopedPointer<QTimer> m_pullTimer; + + QScopedPointer<CMMFDevSound> m_devSound; + TUint32 m_nativeFourCC; + TMMFCapabilities m_nativeFormat; + + // Latest buffer provided by DevSound, to be empied of data. + CMMFDataBuffer *m_devSoundBuffer; + + int m_devSoundBufferSize; + + // Total amount of data in buffers provided by DevSound + int m_totalBytesReady; + + // Queue of buffers returned after call to CMMFDevSound::Pause(). + QList<CMMFDataBuffer *> m_devSoundBufferQ; + + // Current read position within m_devSoundBuffer + qint64 m_devSoundBufferPos; + + // Samples recorded up to the last call to suspend(). It is necessary + // to cache this because suspend() is implemented using + // CMMFDevSound::Stop(), which resets DevSound's SamplesRecorded() counter. + quint32 m_totalSamplesRecorded; + +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/plugins/audio/symbian/symbianaudiooutput.cpp b/src/plugins/audio/symbian/symbianaudiooutput.cpp new file mode 100644 index 0000000..385e169 --- /dev/null +++ b/src/plugins/audio/symbian/symbianaudiooutput.cpp @@ -0,0 +1,697 @@ +/**************************************************************************** +** +** 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 QtMultimedia module 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 "symbianaudiooutput.h" +#include "symbianaudioutils.h" + +QT_BEGIN_NAMESPACE + +//----------------------------------------------------------------------------- +// Constants +//----------------------------------------------------------------------------- + +const int UnderflowTimerInterval = 50; // ms + + +//----------------------------------------------------------------------------- +// Private class +//----------------------------------------------------------------------------- + +SymbianAudioOutputPrivate::SymbianAudioOutputPrivate( + SymbianAudioOutput *audioDevice) + : m_audioDevice(audioDevice) +{ + +} + +SymbianAudioOutputPrivate::~SymbianAudioOutputPrivate() +{ + +} + +qint64 SymbianAudioOutputPrivate::readData(char *data, qint64 len) +{ + Q_UNUSED(data) + Q_UNUSED(len) + return 0; +} + +qint64 SymbianAudioOutputPrivate::writeData(const char *data, qint64 len) +{ + qint64 totalWritten = 0; + + if (m_audioDevice->state() == QAudio::ActiveState || + m_audioDevice->state() == QAudio::IdleState) { + + while (totalWritten < len) { + const qint64 written = m_audioDevice->pushData(data + totalWritten, + len - totalWritten); + if (written > 0) + totalWritten += written; + else + break; + } + } + + return totalWritten; +} + + +//----------------------------------------------------------------------------- +// Public functions +//----------------------------------------------------------------------------- + +SymbianAudioOutput::SymbianAudioOutput(const QByteArray &device, + const QAudioFormat &format) + : m_device(device) + , m_format(format) + , m_clientBufferSize(SymbianAudio::DefaultBufferSize) + , m_notifyInterval(SymbianAudio::DefaultNotifyInterval) + , m_notifyTimer(new QTimer(this)) + , m_error(QAudio::NoError) + , m_internalState(SymbianAudio::ClosedState) + , m_externalState(QAudio::StoppedState) + , m_pullMode(false) + , m_source(0) + , m_devSoundBuffer(0) + , m_devSoundBufferSize(0) + , m_bytesWritten(0) + , m_pushDataReady(false) + , m_bytesPadding(0) + , m_underflow(false) + , m_lastBuffer(false) + , m_underflowTimer(new QTimer(this)) + , m_samplesPlayed(0) + , m_totalSamplesPlayed(0) +{ + connect(m_notifyTimer.data(), SIGNAL(timeout()), this, SIGNAL(notify())); + + SymbianAudio::Utils::formatQtToNative(m_format, m_nativeFourCC, + m_nativeFormat); + + m_underflowTimer->setInterval(UnderflowTimerInterval); + connect(m_underflowTimer.data(), SIGNAL(timeout()), this, + SLOT(underflowTimerExpired())); +} + +SymbianAudioOutput::~SymbianAudioOutput() +{ + close(); +} + +QIODevice* SymbianAudioOutput::start(QIODevice *device) +{ + stop(); + + // We have to set these before the call to open() because of the + // logic in initializingState() + if (device) { + m_pullMode = true; + m_source = device; + } + + open(); + + if (SymbianAudio::ClosedState != m_internalState) { + if (device) { + connect(m_source, SIGNAL(readyRead()), this, SLOT(dataReady())); + } else { + m_source = new SymbianAudioOutputPrivate(this); + m_source->open(QIODevice::WriteOnly | QIODevice::Unbuffered); + } + + m_elapsed.restart(); + } + + return m_source; +} + +void SymbianAudioOutput::stop() +{ + close(); +} + +void SymbianAudioOutput::reset() +{ + m_totalSamplesPlayed += getSamplesPlayed(); + m_devSound->Stop(); + m_bytesPadding = 0; + startPlayback(); +} + +void SymbianAudioOutput::suspend() +{ + if (SymbianAudio::ActiveState == m_internalState + || SymbianAudio::IdleState == m_internalState) { + m_notifyTimer->stop(); + m_underflowTimer->stop(); + + const qint64 samplesWritten = SymbianAudio::Utils::bytesToSamples( + m_format, m_bytesWritten); + m_bytesWritten = 0; + + const qint64 samplesPlayed = getSamplesPlayed(); + + // CMMFDevSound::Pause() is not guaranteed to work correctly in all + // implementations, for play-mode DevSound sessions. We therefore + // have to implement suspend() by calling CMMFDevSound::Stop(). + // Because this causes buffered data to be dropped, we replace the + // lost data with silence following a call to resume(), in order to + // ensure that processedUSecs() returns the correct value. + m_devSound->Stop(); + m_totalSamplesPlayed += samplesPlayed; + + // Calculate the amount of data dropped + const qint64 paddingSamples = samplesWritten - samplesPlayed; + m_bytesPadding = SymbianAudio::Utils::samplesToBytes(m_format, + paddingSamples); + + setState(SymbianAudio::SuspendedState); + } +} + +void SymbianAudioOutput::resume() +{ + if (SymbianAudio::SuspendedState == m_internalState) + startPlayback(); +} + +int SymbianAudioOutput::bytesFree() const +{ + int result = 0; + if (m_devSoundBuffer) { + const TDes8 &outputBuffer = m_devSoundBuffer->Data(); + result = outputBuffer.MaxLength() - outputBuffer.Length(); + } + return result; +} + +int SymbianAudioOutput::periodSize() const +{ + return bufferSize(); +} + +void SymbianAudioOutput::setBufferSize(int value) +{ + // Note that DevSound does not allow its client to specify the buffer size. + // This functionality is available via custom interfaces, but since these + // cannot be guaranteed to work across all DevSound implementations, we + // do not use them here. + // In order to comply with the expected bevahiour of QAudioOutput, we store + // the value and return it from bufferSize(), but the underlying DevSound + // buffer size remains unchanged. + if (value > 0) + m_clientBufferSize = value; +} + +int SymbianAudioOutput::bufferSize() const +{ + return m_devSoundBufferSize ? m_devSoundBufferSize : m_clientBufferSize; +} + +void SymbianAudioOutput::setNotifyInterval(int ms) +{ + if (ms > 0) { + const int oldNotifyInterval = m_notifyInterval; + m_notifyInterval = ms; + if (m_notifyTimer->isActive() && ms != oldNotifyInterval) + m_notifyTimer->start(m_notifyInterval); + } +} + +int SymbianAudioOutput::notifyInterval() const +{ + return m_notifyInterval; +} + +qint64 SymbianAudioOutput::processedUSecs() const +{ + int samplesPlayed = 0; + if (m_devSound && SymbianAudio::SuspendedState != m_internalState) + samplesPlayed = getSamplesPlayed(); + + // Protect against division by zero + Q_ASSERT_X(m_format.frequency() > 0, Q_FUNC_INFO, "Invalid frequency"); + + const qint64 result = qint64(1000000) * + (samplesPlayed + m_totalSamplesPlayed) + / m_format.frequency(); + + return result; +} + +qint64 SymbianAudioOutput::elapsedUSecs() const +{ + const qint64 result = (QAudio::StoppedState == state()) ? + 0 : m_elapsed.elapsed() * 1000; + return result; +} + +QAudio::Error SymbianAudioOutput::error() const +{ + return m_error; +} + +QAudio::State SymbianAudioOutput::state() const +{ + return m_externalState; +} + +QAudioFormat SymbianAudioOutput::format() const +{ + return m_format; +} + +//----------------------------------------------------------------------------- +// MDevSoundObserver implementation +//----------------------------------------------------------------------------- + +void SymbianAudioOutput::InitializeComplete(TInt aError) +{ + Q_ASSERT_X(SymbianAudio::InitializingState == m_internalState, + Q_FUNC_INFO, "Invalid state"); + + if (KErrNone == aError) + startPlayback(); +} + +void SymbianAudioOutput::ToneFinished(TInt aError) +{ + Q_UNUSED(aError) + // This class doesn't use DevSound's tone playback functions, so should + // never receive this callback. + Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback"); +} + +void SymbianAudioOutput::BufferToBeFilled(CMMFBuffer *aBuffer) +{ + // Following receipt of this callback, DevSound should not provide another + // buffer until we have returned the current one. + Q_ASSERT_X(!m_devSoundBuffer, Q_FUNC_INFO, "Buffer already held"); + + // Will be returned to DevSound by bufferFilled(). + m_devSoundBuffer = static_cast<CMMFDataBuffer*>(aBuffer); + + if (!m_devSoundBufferSize) + m_devSoundBufferSize = m_devSoundBuffer->Data().MaxLength(); + + writePaddingData(); + + if (m_pullMode && isDataReady() && !m_bytesPadding) + pullData(); +} + +void SymbianAudioOutput::PlayError(TInt aError) +{ + switch (aError) { + case KErrUnderflow: + m_underflow = true; + if (m_pullMode && !m_lastBuffer) + setError(QAudio::UnderrunError); + else + setState(SymbianAudio::IdleState); + break; + default: + setError(QAudio::IOError); + break; + } +} + +void SymbianAudioOutput::BufferToBeEmptied(CMMFBuffer *aBuffer) +{ + Q_UNUSED(aBuffer) + // This class doesn't use DevSound in record mode, so should never receive + // this callback. + Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback"); +} + +void SymbianAudioOutput::RecordError(TInt aError) +{ + Q_UNUSED(aError) + // This class doesn't use DevSound in record mode, so should never receive + // this callback. + Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback"); +} + +void SymbianAudioOutput::ConvertError(TInt aError) +{ + Q_UNUSED(aError) + // This class doesn't use DevSound's format conversion functions, so + // should never receive this callback. + Q_ASSERT_X(false, Q_FUNC_INFO, "Unexpected callback"); +} + +void SymbianAudioOutput::DeviceMessage(TUid aMessageType, const TDesC8 &aMsg) +{ + Q_UNUSED(aMessageType) + Q_UNUSED(aMsg) + // Ignore this callback. +} + +//----------------------------------------------------------------------------- +// Private functions +//----------------------------------------------------------------------------- + +void SymbianAudioOutput::dataReady() +{ + // Client-provided QIODevice has data ready to read. + + Q_ASSERT_X(m_source->bytesAvailable(), Q_FUNC_INFO, + "readyRead signal received, but no data available"); + + if (!m_bytesPadding) + pullData(); +} + +void SymbianAudioOutput::underflowTimerExpired() +{ + const TInt samplesPlayed = getSamplesPlayed(); + if (m_samplesPlayed && (samplesPlayed == m_samplesPlayed)) { + setError(QAudio::UnderrunError); + } else { + m_samplesPlayed = samplesPlayed; + m_underflowTimer->start(); + } +} + +void SymbianAudioOutput::open() +{ + Q_ASSERT_X(SymbianAudio::ClosedState == m_internalState, + Q_FUNC_INFO, "DevSound already opened"); + + QT_TRAP_THROWING( m_devSound.reset(CMMFDevSound::NewL()) ) + + QScopedPointer<SymbianAudio::DevSoundCapabilities> caps( + new SymbianAudio::DevSoundCapabilities(*m_devSound, + QAudio::AudioOutput)); + + int err = SymbianAudio::Utils::isFormatSupported(m_format, *caps) ? + KErrNone : KErrNotSupported; + + if (KErrNone == err) { + setState(SymbianAudio::InitializingState); + TRAP(err, m_devSound->InitializeL(*this, m_nativeFourCC, + EMMFStatePlaying)); + } + + if (KErrNone != err) { + setError(QAudio::OpenError); + m_devSound.reset(); + } +} + +void SymbianAudioOutput::startPlayback() +{ + TRAPD(err, startDevSoundL()); + if (KErrNone == err) { + if (isDataReady()) + setState(SymbianAudio::ActiveState); + else + setState(SymbianAudio::IdleState); + + m_notifyTimer->start(m_notifyInterval); + m_underflow = false; + + Q_ASSERT(m_devSound->SamplesPlayed() == 0); + + writePaddingData(); + + if (m_pullMode && m_source->bytesAvailable() && !m_bytesPadding) + dataReady(); + } else { + setError(QAudio::OpenError); + close(); + } +} + +void SymbianAudioOutput::startDevSoundL() +{ + TMMFCapabilities nativeFormat = m_devSound->Config(); + m_nativeFormat.iBufferSize = nativeFormat.iBufferSize; + m_devSound->SetConfigL(m_nativeFormat); + m_devSound->PlayInitL(); +} + +void SymbianAudioOutput::writePaddingData() +{ + // See comments in suspend() + + while (m_devSoundBuffer && m_bytesPadding) { + if (SymbianAudio::IdleState == m_internalState) + setState(SymbianAudio::ActiveState); + + TDes8 &outputBuffer = m_devSoundBuffer->Data(); + const qint64 outputBytes = bytesFree(); + const qint64 paddingBytes = outputBytes < m_bytesPadding ? + outputBytes : m_bytesPadding; + unsigned char *ptr = const_cast<unsigned char*>(outputBuffer.Ptr()); + Mem::FillZ(ptr, paddingBytes); + outputBuffer.SetLength(outputBuffer.Length() + paddingBytes); + m_bytesPadding -= paddingBytes; + + if (m_pullMode && m_source->atEnd()) + lastBufferFilled(); + if (paddingBytes == outputBytes) + bufferFilled(); + } +} + +qint64 SymbianAudioOutput::pushData(const char *data, qint64 len) +{ + // Data has been written to SymbianAudioOutputPrivate + + Q_ASSERT_X(!m_pullMode, Q_FUNC_INFO, + "pushData called when in pull mode"); + + const unsigned char *const inputPtr = + reinterpret_cast<const unsigned char*>(data); + qint64 bytesWritten = 0; + + if (SymbianAudio::IdleState == m_internalState) + setState(SymbianAudio::ActiveState); + + while (m_devSoundBuffer && (bytesWritten < len)) { + // writePaddingData() is called from BufferToBeFilled(), so we should + // never have any padding data left at this point. + Q_ASSERT_X(0 == m_bytesPadding, Q_FUNC_INFO, + "Padding bytes remaining in pushData"); + + TDes8 &outputBuffer = m_devSoundBuffer->Data(); + + const qint64 outputBytes = bytesFree(); + const qint64 inputBytes = len - bytesWritten; + const qint64 copyBytes = outputBytes < inputBytes ? + outputBytes : inputBytes; + + outputBuffer.Append(inputPtr + bytesWritten, copyBytes); + bytesWritten += copyBytes; + + bufferFilled(); + } + + m_pushDataReady = (bytesWritten < len); + + // If DevSound is still initializing (m_internalState == InitializingState), + // we cannot transition m_internalState to ActiveState, but we must emit + // an (external) state change from IdleState to ActiveState. The following + // call triggers this signal. + setState(m_internalState); + + return bytesWritten; +} + +void SymbianAudioOutput::pullData() +{ + Q_ASSERT_X(m_pullMode, Q_FUNC_INFO, + "pullData called when in push mode"); + + if (m_bytesPadding) + m_bytesPadding = 1; + + // writePaddingData() is called by BufferToBeFilled() before pullData(), + // so we should never have any padding data left at this point. + Q_ASSERT_X(0 == m_bytesPadding, Q_FUNC_INFO, + "Padding bytes remaining in pullData"); + + qint64 inputBytes = m_source->bytesAvailable(); + while (m_devSoundBuffer && inputBytes) { + if (SymbianAudio::IdleState == m_internalState) + setState(SymbianAudio::ActiveState); + + TDes8 &outputBuffer = m_devSoundBuffer->Data(); + + const qint64 outputBytes = bytesFree(); + const qint64 copyBytes = outputBytes < inputBytes ? + outputBytes : inputBytes; + + char *outputPtr = (char*)(outputBuffer.Ptr() + outputBuffer.Length()); + const qint64 bytesCopied = m_source->read(outputPtr, copyBytes); + Q_ASSERT(bytesCopied == copyBytes); + outputBuffer.SetLength(outputBuffer.Length() + bytesCopied); + inputBytes -= bytesCopied; + + if (m_source->atEnd()) + lastBufferFilled(); + else if (copyBytes == outputBytes) + bufferFilled(); + } +} + +void SymbianAudioOutput::bufferFilled() +{ + Q_ASSERT_X(m_devSoundBuffer, Q_FUNC_INFO, "No buffer to return"); + + const TDes8 &outputBuffer = m_devSoundBuffer->Data(); + m_bytesWritten += outputBuffer.Length(); + + m_devSoundBuffer = 0; + + m_samplesPlayed = getSamplesPlayed(); + m_underflowTimer->start(); + + if (QAudio::UnderrunError == m_error) + m_error = QAudio::NoError; + + m_devSound->PlayData(); +} + +void SymbianAudioOutput::lastBufferFilled() +{ + Q_ASSERT_X(m_devSoundBuffer, Q_FUNC_INFO, "No buffer to fill"); + Q_ASSERT_X(!m_lastBuffer, Q_FUNC_INFO, "Last buffer already sent"); + m_lastBuffer = true; + m_devSoundBuffer->SetLastBuffer(ETrue); + bufferFilled(); +} + +void SymbianAudioOutput::close() +{ + m_notifyTimer->stop(); + m_underflowTimer->stop(); + + m_error = QAudio::NoError; + + if (m_devSound) + m_devSound->Stop(); + m_devSound.reset(); + m_devSoundBuffer = 0; + m_devSoundBufferSize = 0; + + if (!m_pullMode) // m_source is owned + delete m_source; + m_pullMode = false; + m_source = 0; + + m_bytesWritten = 0; + m_pushDataReady = false; + m_bytesPadding = 0; + m_underflow = false; + m_lastBuffer = false; + m_samplesPlayed = 0; + m_totalSamplesPlayed = 0; + + setState(SymbianAudio::ClosedState); +} + +qint64 SymbianAudioOutput::getSamplesPlayed() const +{ + qint64 result = 0; + if (m_devSound) { + const qint64 samplesWritten = SymbianAudio::Utils::bytesToSamples( + m_format, m_bytesWritten); + + if (m_underflow) { + result = samplesWritten; + } else { + // This is necessary because some DevSound implementations report + // that they have played more data than has actually been provided to them + // by the client. + const qint64 devSoundSamplesPlayed(m_devSound->SamplesPlayed()); + result = qMin(devSoundSamplesPlayed, samplesWritten); + } + } + return result; +} + +void SymbianAudioOutput::setError(QAudio::Error error) +{ + m_error = error; + + // Although no state transition actually occurs here, a stateChanged event + // must be emitted to inform the client that the call to start() was + // unsuccessful. + if (QAudio::OpenError == error) + emit stateChanged(QAudio::StoppedState); + + if (QAudio::UnderrunError == error) + setState(SymbianAudio::IdleState); + else + // Close the DevSound instance. This causes a transition to + // StoppedState. This must be done asynchronously in case the + // current function was called from a DevSound event handler, in which + // case deleting the DevSound instance may cause an exception. + QMetaObject::invokeMethod(this, "close", Qt::QueuedConnection); +} + +void SymbianAudioOutput::setState(SymbianAudio::State newInternalState) +{ + const QAudio::State oldExternalState = m_externalState; + m_internalState = newInternalState; + m_externalState = SymbianAudio::Utils::stateNativeToQt( + m_internalState, initializingState()); + + if (m_externalState != oldExternalState) + emit stateChanged(m_externalState); +} + +bool SymbianAudioOutput::isDataReady() const +{ + return (m_source && m_source->bytesAvailable()) + || m_bytesPadding + || m_pushDataReady; +} + +QAudio::State SymbianAudioOutput::initializingState() const +{ + return isDataReady() ? QAudio::ActiveState : QAudio::IdleState; +} + +QT_END_NAMESPACE diff --git a/src/plugins/audio/symbian/symbianaudiooutput.h b/src/plugins/audio/symbian/symbianaudiooutput.h new file mode 100644 index 0000000..8994e46 --- /dev/null +++ b/src/plugins/audio/symbian/symbianaudiooutput.h @@ -0,0 +1,199 @@ +/**************************************************************************** +** +** 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 QtMultimedia module 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 SYMBIANAUDIOOUTPUT_H +#define SYMBIANAUDIOOUTPUT_H + +#include <QtMultimedia/qaudioengine.h> +#include <QTime> +#include <QTimer> +#include <sounddevice.h> +#include "symbianaudio.h" + +QT_BEGIN_NAMESPACE + +class SymbianAudioOutput; + +class SymbianAudioOutputPrivate : public QIODevice +{ + friend class SymbianAudioOutput; + Q_OBJECT +public: + SymbianAudioOutputPrivate(SymbianAudioOutput *audio); + ~SymbianAudioOutputPrivate(); + + qint64 readData(char *data, qint64 len); + qint64 writeData(const char *data, qint64 len); + +private: + SymbianAudioOutput *const m_audioDevice; +}; + +class SymbianAudioOutput + : public QAbstractAudioOutput + , public MDevSoundObserver +{ + friend class SymbianAudioOutputPrivate; + Q_OBJECT +public: + SymbianAudioOutput(const QByteArray &device, + const QAudioFormat &audioFormat); + ~SymbianAudioOutput(); + + // QAbstractAudioOutput + QIODevice* start(QIODevice *device = 0); + void stop(); + void reset(); + void suspend(); + void resume(); + int bytesFree() const; + int periodSize() const; + void setBufferSize(int value); + int bufferSize() const; + void setNotifyInterval(int milliSeconds); + int notifyInterval() const; + qint64 processedUSecs() const; + qint64 elapsedUSecs() const; + QAudio::Error error() const; + QAudio::State state() const; + QAudioFormat format() const; + + // MDevSoundObserver + void InitializeComplete(TInt aError); + void ToneFinished(TInt aError); + void BufferToBeFilled(CMMFBuffer *aBuffer); + void PlayError(TInt aError); + void BufferToBeEmptied(CMMFBuffer *aBuffer); + void RecordError(TInt aError); + void ConvertError(TInt aError); + void DeviceMessage(TUid aMessageType, const TDesC8 &aMsg); + +private slots: + void dataReady(); + void underflowTimerExpired(); + +private: + void open(); + void startPlayback(); + void startDevSoundL(); + void writePaddingData(); + qint64 pushData(const char *data, qint64 len); + void pullData(); + void bufferFilled(); + void lastBufferFilled(); + Q_INVOKABLE void close(); + + qint64 getSamplesPlayed() const; + + void setError(QAudio::Error error); + void setState(SymbianAudio::State state); + + bool isDataReady() const; + QAudio::State initializingState() const; + +private: + const QByteArray m_device; + const QAudioFormat m_format; + + int m_clientBufferSize; + int m_notifyInterval; + QScopedPointer<QTimer> m_notifyTimer; + QTime m_elapsed; + QAudio::Error m_error; + + SymbianAudio::State m_internalState; + QAudio::State m_externalState; + + bool m_pullMode; + QIODevice *m_source; + + QScopedPointer<CMMFDevSound> m_devSound; + TUint32 m_nativeFourCC; + TMMFCapabilities m_nativeFormat; + + // Buffer provided by DevSound, to be filled with data. + CMMFDataBuffer *m_devSoundBuffer; + + int m_devSoundBufferSize; + + // Number of bytes transferred from QIODevice to QAudioOutput. It is + // necessary to count this because data is dropped when suspend() is + // called. The difference between the position reported by DevSound and + // this value allows us to calculate m_bytesPadding; + quint32 m_bytesWritten; + + // True if client has provided data while the audio subsystem was not + // ready to consume it. + bool m_pushDataReady; + + // Number of zero bytes which will be written when client calls resume(). + quint32 m_bytesPadding; + + // True if PlayError(KErrUnderflow) has been called. + bool m_underflow; + + // True if a buffer marked with the "last buffer" flag has been provided + // to DevSound. + bool m_lastBuffer; + + // Some DevSound implementations ignore all underflow errors raised by the + // audio driver, unless the last buffer flag has been set by the client. + // In push-mode playback, this flag will never be set, so the underflow + // error will never be reported. In order to work around this, a timer + // is used, which gets reset every time the client provides more data. If + // the timer expires, an underflow error is raised by this object. + QScopedPointer<QTimer> m_underflowTimer; + + // Result of previous call to CMMFDevSound::SamplesPlayed(). This value is + // used to determine whether, when m_underflowTimer expires, an + // underflow error has actually occurred. + quint32 m_samplesPlayed; + + // Samples played up to the last call to suspend(). It is necessary + // to cache this because suspend() is implemented using + // CMMFDevSound::Stop(), which resets DevSound's SamplesPlayed() counter. + quint32 m_totalSamplesPlayed; + +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/plugins/audio/symbian/symbianaudioutils.cpp b/src/plugins/audio/symbian/symbianaudioutils.cpp new file mode 100644 index 0000000..f04c198 --- /dev/null +++ b/src/plugins/audio/symbian/symbianaudioutils.cpp @@ -0,0 +1,395 @@ +/**************************************************************************** +** +** 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 QtMultimedia module 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 "symbianaudioutils.h" +#include <mmffourcc.h> + +QT_BEGIN_NAMESPACE + +namespace SymbianAudio { + +DevSoundCapabilities::DevSoundCapabilities(CMMFDevSound &devsound, + QAudio::Mode mode) +{ + QT_TRAP_THROWING(constructL(devsound, mode)); +} + +DevSoundCapabilities::~DevSoundCapabilities() +{ + m_fourCC.Close(); +} + +void DevSoundCapabilities::constructL(CMMFDevSound &devsound, + QAudio::Mode mode) +{ + m_caps = devsound.Capabilities(); + + TMMFPrioritySettings settings; + + switch (mode) { + case QAudio::AudioOutput: + settings.iState = EMMFStatePlaying; + devsound.GetSupportedInputDataTypesL(m_fourCC, settings); + break; + + case QAudio::AudioInput: + settings.iState = EMMFStateRecording; + devsound.GetSupportedInputDataTypesL(m_fourCC, settings); + break; + + default: + Q_ASSERT_X(false, Q_FUNC_INFO, "Invalid mode"); + } +} + +namespace Utils { + +//----------------------------------------------------------------------------- +// Static data +//----------------------------------------------------------------------------- + +// Sample rate / frequency + +typedef TMMFSampleRate SampleRateNative; +typedef int SampleRateQt; + +const int SampleRateCount = 12; + +const SampleRateNative SampleRateListNative[SampleRateCount] = { + EMMFSampleRate8000Hz + , EMMFSampleRate11025Hz + , EMMFSampleRate12000Hz + , EMMFSampleRate16000Hz + , EMMFSampleRate22050Hz + , EMMFSampleRate24000Hz + , EMMFSampleRate32000Hz + , EMMFSampleRate44100Hz + , EMMFSampleRate48000Hz + , EMMFSampleRate64000Hz + , EMMFSampleRate88200Hz + , EMMFSampleRate96000Hz +}; + +const SampleRateQt SampleRateListQt[SampleRateCount] = { + 8000 + , 11025 + , 12000 + , 16000 + , 22050 + , 24000 + , 32000 + , 44100 + , 48000 + , 64000 + , 88200 + , 96000 +}; + +// Channels + +typedef TMMFMonoStereo ChannelsNative; +typedef int ChannelsQt; + +const int ChannelsCount = 2; + +const ChannelsNative ChannelsListNative[ChannelsCount] = { + EMMFMono + , EMMFStereo +}; + +const ChannelsQt ChannelsListQt[ChannelsCount] = { + 1 + , 2 +}; + +// Encoding + +const int EncodingCount = 6; + +const TUint32 EncodingFourCC[EncodingCount] = { + KMMFFourCCCodePCM8 // 0 + , KMMFFourCCCodePCMU8 // 1 + , KMMFFourCCCodePCM16 // 2 + , KMMFFourCCCodePCMU16 // 3 + , KMMFFourCCCodePCM16B // 4 + , KMMFFourCCCodePCMU16B // 5 +}; + +// The characterised DevSound API specification states that the iEncoding +// field in TMMFCapabilities is ignored, and that the FourCC should be used +// to specify the PCM encoding. +// See "SGL.GT0287.102 Multimedia DevSound Baseline Compatibility.doc" in the +// mm_info/mm_docs repository. +const TMMFSoundEncoding EncodingNative[EncodingCount] = { + EMMFSoundEncoding16BitPCM // 0 + , EMMFSoundEncoding16BitPCM // 1 + , EMMFSoundEncoding16BitPCM // 2 + , EMMFSoundEncoding16BitPCM // 3 + , EMMFSoundEncoding16BitPCM // 4 + , EMMFSoundEncoding16BitPCM // 5 +}; + + +const int EncodingSampleSize[EncodingCount] = { + 8 // 0 + , 8 // 1 + , 16 // 2 + , 16 // 3 + , 16 // 4 + , 16 // 5 +}; + +const QAudioFormat::Endian EncodingByteOrder[EncodingCount] = { + QAudioFormat::LittleEndian // 0 + , QAudioFormat::LittleEndian // 1 + , QAudioFormat::LittleEndian // 2 + , QAudioFormat::LittleEndian // 3 + , QAudioFormat::BigEndian // 4 + , QAudioFormat::BigEndian // 5 +}; + +const QAudioFormat::SampleType EncodingSampleType[EncodingCount] = { + QAudioFormat::SignedInt // 0 + , QAudioFormat::UnSignedInt // 1 + , QAudioFormat::SignedInt // 2 + , QAudioFormat::UnSignedInt // 3 + , QAudioFormat::SignedInt // 4 + , QAudioFormat::UnSignedInt // 5 +}; + + +//----------------------------------------------------------------------------- +// Private functions +//----------------------------------------------------------------------------- + +// Helper functions for implementing parameter conversions + +template<typename Input> +bool findValue(const Input *inputArray, int length, Input input, int &index) { + bool result = false; + for (int i=0; !result && i<length; ++i) + if (inputArray[i] == input) { + index = i; + result = true; + } + return result; +} + +template<typename Input, typename Output> +bool convertValue(const Input *inputArray, const Output *outputArray, + int length, Input input, Output &output) { + int index; + const bool result = findValue<Input>(inputArray, length, input, index); + if (result) + output = outputArray[index]; + return result; +} + +/** + * Macro which is used to generate the implementation of the conversion + * functions. The implementation is just a wrapper around the templated + * convertValue function, e.g. + * + * CONVERSION_FUNCTION_IMPL(SampleRate, Qt, Native) + * + * expands to + * + * bool SampleRateQtToNative(int input, TMMFSampleRate &output) { + * return convertValue<SampleRateQt, SampleRateNative> + * (SampleRateListQt, SampleRateListNative, SampleRateCount, + * input, output); + * } + */ +#define CONVERSION_FUNCTION_IMPL(FieldLc, Field, Input, Output) \ +bool FieldLc##Input##To##Output(Field##Input input, Field##Output &output) { \ + return convertValue<Field##Input, Field##Output>(Field##List##Input, \ + Field##List##Output, Field##Count, input, output); \ +} + +//----------------------------------------------------------------------------- +// Local helper functions +//----------------------------------------------------------------------------- + +CONVERSION_FUNCTION_IMPL(sampleRate, SampleRate, Qt, Native) +CONVERSION_FUNCTION_IMPL(sampleRate, SampleRate, Native, Qt) +CONVERSION_FUNCTION_IMPL(channels, Channels, Qt, Native) +CONVERSION_FUNCTION_IMPL(channels, Channels, Native, Qt) + +bool sampleInfoQtToNative(int inputSampleSize, + QAudioFormat::Endian inputByteOrder, + QAudioFormat::SampleType inputSampleType, + TUint32 &outputFourCC, + TMMFSoundEncoding &outputEncoding) { + + bool found = false; + + for (int i=0; i<EncodingCount && !found; ++i) { + if ( EncodingSampleSize[i] == inputSampleSize + && EncodingByteOrder[i] == inputByteOrder + && EncodingSampleType[i] == inputSampleType) { + outputFourCC = EncodingFourCC[i]; + outputEncoding = EncodingNative[i]; // EMMFSoundEncoding16BitPCM + found = true; + } + } + + return found; +} + +//----------------------------------------------------------------------------- +// Public functions +//----------------------------------------------------------------------------- + +void capabilitiesNativeToQt(const DevSoundCapabilities &caps, + QList<int> &frequencies, + QList<int> &channels, + QList<int> &sampleSizes, + QList<QAudioFormat::Endian> &byteOrders, + QList<QAudioFormat::SampleType> &sampleTypes) { + + frequencies.clear(); + sampleSizes.clear(); + byteOrders.clear(); + sampleTypes.clear(); + channels.clear(); + + for (int i=0; i<SampleRateCount; ++i) + if (caps.caps().iRate & SampleRateListNative[i]) + frequencies += SampleRateListQt[i]; + + for (int i=0; i<ChannelsCount; ++i) + if (caps.caps().iChannels & ChannelsListNative[i]) + channels += ChannelsListQt[i]; + + for (int i=0; i<EncodingCount; ++i) { + if (caps.fourCC().Find(EncodingFourCC[i]) != KErrNotFound) { + sampleSizes += EncodingSampleSize[i]; + byteOrders += EncodingByteOrder[i]; + sampleTypes += EncodingSampleType[i]; + } + } + +} + +bool isFormatSupported(const QAudioFormat &formatQt, + const DevSoundCapabilities &caps) { + TMMFCapabilities formatNative; + TUint32 fourCC; + + bool result = false; + if (formatQt.codec() == "audio/pcm" && + formatQtToNative(formatQt, fourCC, formatNative)) { + result = + (formatNative.iRate & caps.caps().iRate) + && (formatNative.iChannels & caps.caps().iChannels) + && (caps.fourCC().Find(fourCC) != KErrNotFound); + } + return result; +} + +bool formatQtToNative(const QAudioFormat &inputFormat, + TUint32 &outputFourCC, + TMMFCapabilities &outputFormat) { + + bool result = false; + + // Need to use temporary variables because TMMFCapabilities fields are all + // TInt, rather than MMF enumerated types. + TMMFSampleRate outputSampleRate; + TMMFMonoStereo outputChannels; + TMMFSoundEncoding outputEncoding; + + if (inputFormat.codec() == "audio/pcm") { + result = + sampleRateQtToNative(inputFormat.frequency(), outputSampleRate) + && channelsQtToNative(inputFormat.channels(), outputChannels) + && sampleInfoQtToNative(inputFormat.sampleSize(), + inputFormat.byteOrder(), + inputFormat.sampleType(), + outputFourCC, + outputEncoding); + } + + if (result) { + outputFormat.iRate = outputSampleRate; + outputFormat.iChannels = outputChannels; + outputFormat.iEncoding = outputEncoding; + } + + return result; +} + +QAudio::State stateNativeToQt(State nativeState, + QAudio::State initializingState) +{ + switch (nativeState) { + case ClosedState: + return QAudio::StoppedState; + case InitializingState: + return initializingState; + case ActiveState: + return QAudio::ActiveState; + case IdleState: + return QAudio::IdleState; + case SuspendedState: + return QAudio::SuspendedState; + default: + Q_ASSERT_X(false, Q_FUNC_INFO, "Invalid state"); + return QAudio::StoppedState; // suppress compiler warning + } +} + +qint64 bytesToSamples(const QAudioFormat &format, qint64 length) +{ + return length / ((format.sampleSize() / 8) * format.channels()); +} + +qint64 samplesToBytes(const QAudioFormat &format, qint64 samples) +{ + return samples * (format.sampleSize() / 8) * format.channels(); +} + +} // namespace Utils +} // namespace SymbianAudio + +QT_END_NAMESPACE + + diff --git a/src/plugins/audio/symbian/symbianaudioutils.h b/src/plugins/audio/symbian/symbianaudioutils.h new file mode 100644 index 0000000..53274e0 --- /dev/null +++ b/src/plugins/audio/symbian/symbianaudioutils.h @@ -0,0 +1,125 @@ +/**************************************************************************** +** +** 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 QtMultimedia module 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 SYMBIANAUDIOUTILS_H +#define SYMBIANAUDIOUTILS_H + +#include <QtCore/qnamespace.h> +#include <QtMultimedia/qaudioformat.h> +#include <QtMultimedia/qaudio.h> +#include <sounddevice.h> +#include "symbianaudio.h" + +QT_BEGIN_NAMESPACE + +namespace SymbianAudio { + +/* + * Helper class for querying DevSound codec / format support + */ +class DevSoundCapabilities { +public: + DevSoundCapabilities(CMMFDevSound &devsound, QAudio::Mode mode); + ~DevSoundCapabilities(); + + const RArray<TFourCC>& fourCC() const { return m_fourCC; } + const TMMFCapabilities& caps() const { return m_caps; } + +private: + void constructL(CMMFDevSound &devsound, QAudio::Mode mode); + +private: + RArray<TFourCC> m_fourCC; + TMMFCapabilities m_caps; +}; + +namespace Utils { + +/** + * Convert native audio capabilities to QAudio lists. + */ +void capabilitiesNativeToQt(const DevSoundCapabilities &caps, + QList<int> &frequencies, + QList<int> &channels, + QList<int> &sampleSizes, + QList<QAudioFormat::Endian> &byteOrders, + QList<QAudioFormat::SampleType> &sampleTypes); + +/** + * Check whether format is supported. + */ +bool isFormatSupported(const QAudioFormat &format, + const DevSoundCapabilities &caps); + +/** + * Convert QAudioFormat to native format types. + * + * Note that, despite the name, DevSound uses TMMFCapabilities to specify + * single formats as well as capabilities. + * + * Note that this function does not modify outputFormat.iBufferSize. + */ +bool formatQtToNative(const QAudioFormat &inputFormat, + TUint32 &outputFourCC, + TMMFCapabilities &outputFormat); + +/** + * Convert internal states to QAudio states. + */ +QAudio::State stateNativeToQt(State nativeState, + QAudio::State initializingState); + +/** + * Convert data length to number of samples. + */ +qint64 bytesToSamples(const QAudioFormat &format, qint64 length); + +/** + * Convert number of samples to data length. + */ +qint64 samplesToBytes(const QAudioFormat &format, qint64 samples); + +} // namespace Utils +} // namespace SymbianAudio + +QT_END_NAMESPACE + +#endif diff --git a/src/qbase.pri b/src/qbase.pri index 58bb6d4..ef5d9e5 100644 --- a/src/qbase.pri +++ b/src/qbase.pri @@ -108,6 +108,10 @@ symbian { } } load(armcc_warnings) + + # workaround for the fact that some of our required includes in Symbian^3 + # now depend upon files in epoc32/include/platform + INCLUDEPATH += $$OS_LAYER_SYSTEMINCLUDE } win32-borland:INCLUDEPATH += kernel diff --git a/src/s60installs/qt.iby b/src/s60installs/qt.iby index a6a96ec..724451b 100644 --- a/src/s60installs/qt.iby +++ b/src/s60installs/qt.iby @@ -80,6 +80,9 @@ file=ABI_DIR\BUILD_DIR\qsvgicon.dll SHARED_LIB_DIR\qsvgicon.dll PAG // Phonon MMF backend file=ABI_DIR\BUILD_DIR\phonon_mmf.dll SHARED_LIB_DIR\phonon_mmf.dll PAGED +// QtMultimedia audio backend +file=ABI_DIR\BUILD_DIR\qaudio.dll SHARED_LIB_DIR\qaudio.dll PAGED + // graphicssystems file=ABI_DIR\BUILD_DIR\qvggraphicssystem.dll SHARED_LIB_DIR\qvggraphicssystem.dll PAGED @@ -109,6 +112,9 @@ data=\epoc32\data\z\resource\qt\plugins\iconengines\qsvgicon.qtplugin resou // Phonon MMF backend data=\epoc32\data\z\resource\qt\plugins\phonon_backend\phonon_mmf.qtplugin resource\qt\plugins\phonon_backend\phonon_mmf.qtplugin +// QtMultimedia audio backend +data=\epoc32\data\qt\qtlibspluginstubs\qaudio.qtplugin resource\qt\plugins\audio\qaudio.qtplugin + // graphicssystems data=\epoc32\data\z\resource\qt\plugins\graphicssystems\qvggraphicssystem.qtplugin resource\qt\plugins\graphicssystems\qvggraphicssystem.qtplugin diff --git a/src/s60installs/s60installs.pro b/src/s60installs/s60installs.pro index 5318693..1f3b4a6 100644 --- a/src/s60installs/s60installs.pro +++ b/src/s60installs/s60installs.pro @@ -78,6 +78,12 @@ symbian: { DEPLOYMENT += phonon_backend_plugins } + contains(QT_CONFIG, audio-backend) { + qaudio_backend_plugins.sources += qaudio.dll + qaudio_backend_plugins.path = c:$$QT_PLUGINS_BASE_DIR/audio + DEPLOYMENT += qaudio_backend_plugins + } + # Support backup & restore for Qt libraries qtbackup.sources = backup_registration.xml qtbackup.path = c:/private/10202D56/import/packages/$$replace(TARGET.UID3, 0x,) diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp index 40daecb..ca10b01 100644 --- a/src/testlib/qtestcase.cpp +++ b/src/testlib/qtestcase.cpp @@ -1123,6 +1123,14 @@ static void qParseArgs(int argc, char *argv[]) #endif } else if (strcmp(argv[i], "-qws") == 0) { // do nothing + } else if (strcmp(argv[i], "-graphicssystem") == 0) { + // do nothing + if (i + 1 >= argc) { + printf("-graphicssystem needs an extra parameter specifying the graphics system\n"); + exit(1); + } else { + ++i; + } } else if (argv[i][0] == '-') { printf("Unknown option: '%s'\n\n%s", argv[i], testOptions); exit(1); @@ -1308,11 +1316,23 @@ static bool qInvokeTestMethod(const char *slotName, const char *data=0) const int dataCount = table.dataCount(); QTestResult::setSkipCurrentTest(false); + // Data tag requested but none available? + if (data && !dataCount) { + // Let empty data tag through. + if (!*data) + data = 0; + else { + printf("Unknown testdata for function %s: '%s'\n", slotName, data); + printf("Function has no testdata.\n"); + return false; + } + } + /* For each entry in the data table, do: */ do { if (!data || !qstrcmp(data, table.testData(curDataIndex)->dataTag())) { foundFunction = true; - QTestDataSetter s(table.isEmpty() ? static_cast<QTestData *>(0) + QTestDataSetter s(curDataIndex >= dataCount ? static_cast<QTestData *>(0) : table.testData(curDataIndex)); qInvokeTestMethodDataEntry(slot); diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro index a2c682b..7ba6243 100644 --- a/tests/auto/auto.pro +++ b/tests/auto/auto.pro @@ -460,17 +460,16 @@ SUBDIRS += \ qplugin \ qpluginloader \ qscrollbar \ - qsharedmemory \ qsidebar \ qsizegrip \ qsqldriver \ - qsystemsemaphore \ qtconcurrentfilter \ qtconcurrentiteratekernel \ qtconcurrentmap \ qtconcurrentrun \ qtconcurrentthreadengine \ qthreadpool \ + qtipc \ qtokenautomaton \ qtouchevent \ qwidget_window \ @@ -534,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/gestures/tst_gestures.cpp b/tests/auto/gestures/tst_gestures.cpp index e6de590..24391c0 100644 --- a/tests/auto/gestures/tst_gestures.cpp +++ b/tests/auto/gestures/tst_gestures.cpp @@ -334,6 +334,8 @@ private slots: void autoCancelGestures(); void autoCancelGestures2(); void graphicsViewParentPropagation(); + void panelPropagation(); + void panelStacksBehindParent(); }; tst_Gestures::tst_Gestures() @@ -1482,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); @@ -1557,5 +1557,172 @@ void tst_Gestures::graphicsViewParentPropagation() 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 bf7ec3f..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) { @@ -209,6 +216,11 @@ void tst_Headers::licenseCheck() 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/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/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/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/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp index 05e2e1b..cafeef0 100644 --- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp +++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp @@ -263,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(); @@ -318,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())); @@ -339,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(); @@ -2117,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() @@ -3866,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/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/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/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/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/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/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/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/qmake/generators/symbian/epocroot.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.h index be26438..8676d92 100644 --- a/qmake/generators/symbian/epocroot.h +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.h @@ -4,7 +4,7 @@ ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the qmake application of the Qt Toolkit. +** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage @@ -39,13 +39,14 @@ ** ****************************************************************************/ -#ifndef EPOCROOT_H -#define EPOCROOT_H +#ifndef COMMANDLINE_H +#define COMMANDLINE_H -#include <qstring.h> +#include "settings.h" -// Implementation of epocRoot method is in initprojectdeploy_symbian.cpp -// Defined in separate header for inclusion clarity -extern QString epocRoot(); +bool readSettingsFromCommandLine(int argc, + char *argv[], + Settings& settings); -#endif // EPOCROOT_H + +#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/tools/assistant/lib/qhelpsearchengine.cpp b/tools/assistant/lib/qhelpsearchengine.cpp index 7c2635d..9914efa 100644 --- a/tools/assistant/lib/qhelpsearchengine.cpp +++ b/tools/assistant/lib/qhelpsearchengine.cpp @@ -63,9 +63,9 @@ QT_BEGIN_NAMESPACE #if defined(QT_CLUCENE_SUPPORT) - using namespace qt::fulltextsearch::clucene; + using namespace fulltextsearch::clucene; #else - using namespace qt::fulltextsearch::std; + using namespace fulltextsearch::std; #endif class QHelpSearchEnginePrivate : public QObject @@ -195,7 +195,7 @@ private: QHelpSearchQueryWidget *queryWidget; QHelpSearchResultWidget *resultWidget; - qt::fulltextsearch::QHelpSearchIndexReader *indexReader; + fulltextsearch::QHelpSearchIndexReader *indexReader; QHelpSearchIndexWriter *indexWriter; QPointer<QHelpEngineCore> helpEngine; diff --git a/tools/assistant/lib/qhelpsearchindexreader.cpp b/tools/assistant/lib/qhelpsearchindexreader.cpp index 92d7658..e79fca6 100644 --- a/tools/assistant/lib/qhelpsearchindexreader.cpp +++ b/tools/assistant/lib/qhelpsearchindexreader.cpp @@ -43,8 +43,7 @@ QT_BEGIN_NAMESPACE -namespace qt { - namespace fulltextsearch { +namespace fulltextsearch { QHelpSearchIndexReader::QHelpSearchIndexReader() : QThread() @@ -100,7 +99,6 @@ QList<QHelpSearchEngine::SearchHit> QHelpSearchIndexReader::hits(int start, } - } // namespace fulltextsearch -} // namespace qt +} // namespace fulltextsearch QT_END_NAMESPACE diff --git a/tools/assistant/lib/qhelpsearchindexreader_clucene.cpp b/tools/assistant/lib/qhelpsearchindexreader_clucene.cpp index ee6dcfb..c2274c4 100644 --- a/tools/assistant/lib/qhelpsearchindexreader_clucene.cpp +++ b/tools/assistant/lib/qhelpsearchindexreader_clucene.cpp @@ -58,9 +58,8 @@ QT_BEGIN_NAMESPACE -namespace qt { - namespace fulltextsearch { - namespace clucene { +namespace fulltextsearch { +namespace clucene { QHelpSearchIndexReaderClucene::QHelpSearchIndexReaderClucene() : QHelpSearchIndexReader() @@ -476,8 +475,7 @@ void QHelpSearchIndexReaderClucene::boostSearchHits(const QHelpEngineCore &engin } } - } // namespace clucene - } // namespace fulltextsearch -} // namespace qt +} // namespace clucene +} // namespace fulltextsearch QT_END_NAMESPACE diff --git a/tools/assistant/lib/qhelpsearchindexreader_default.cpp b/tools/assistant/lib/qhelpsearchindexreader_default.cpp index d2241a5..11a50d9 100644 --- a/tools/assistant/lib/qhelpsearchindexreader_default.cpp +++ b/tools/assistant/lib/qhelpsearchindexreader_default.cpp @@ -52,9 +52,8 @@ QT_BEGIN_NAMESPACE -namespace qt { - namespace fulltextsearch { - namespace std { +namespace fulltextsearch { +namespace std { namespace { QStringList split( const QString &str ) @@ -607,8 +606,7 @@ void QHelpSearchIndexReaderDefault::run() emit searchingFinished(hitList.count()); } - } // namespace std - } // namespace fulltextsearch -} // namespace qt +} // namespace std +} // namespace fulltextsearch QT_END_NAMESPACE diff --git a/tools/assistant/lib/qhelpsearchindexreader_default_p.h b/tools/assistant/lib/qhelpsearchindexreader_default_p.h index 8c80608..b30fa4b 100644 --- a/tools/assistant/lib/qhelpsearchindexreader_default_p.h +++ b/tools/assistant/lib/qhelpsearchindexreader_default_p.h @@ -64,9 +64,8 @@ QT_BEGIN_NAMESPACE struct Entry; struct PosEntry; -namespace qt { - namespace fulltextsearch { - namespace std { +namespace fulltextsearch { +namespace std { class Reader { @@ -127,9 +126,8 @@ private: Reader m_reader; }; - } // namespace std - } // namespace fulltextsearch -} // namespace qt +} // namespace std +} // namespace fulltextsearch QT_END_NAMESPACE diff --git a/tools/assistant/lib/qhelpsearchindexreader_p.h b/tools/assistant/lib/qhelpsearchindexreader_p.h index b309f46..4d27c0f 100644 --- a/tools/assistant/lib/qhelpsearchindexreader_p.h +++ b/tools/assistant/lib/qhelpsearchindexreader_p.h @@ -66,8 +66,7 @@ QT_BEGIN_NAMESPACE class QHelpEngineCore; -namespace qt { - namespace fulltextsearch { +namespace fulltextsearch { class QHelpSearchIndexReader : public QThread { @@ -100,8 +99,7 @@ private: virtual void run()=0; }; - } // namespace fulltextsearch -} // namespace qt +} // namespace fulltextsearch QT_END_NAMESPACE diff --git a/tools/assistant/lib/qhelpsearchindexwriter_clucene.cpp b/tools/assistant/lib/qhelpsearchindexwriter_clucene.cpp index 6e49e54..d9dcec5 100644 --- a/tools/assistant/lib/qhelpsearchindexwriter_clucene.cpp +++ b/tools/assistant/lib/qhelpsearchindexwriter_clucene.cpp @@ -64,9 +64,8 @@ QT_BEGIN_NAMESPACE -namespace qt { - namespace fulltextsearch { - namespace clucene { +namespace fulltextsearch { +namespace clucene { // taken from qtexthtmlparser static const struct QTextHtmlEntity @@ -893,8 +892,7 @@ void QHelpSearchIndexWriter::closeIndexWriter(QCLuceneIndexWriter *writer) #endif } - } // namespace clucene - } // namespace fulltextsearch -} // namespace qt +} // namespace clucene +} // namespace fulltextsearch QT_END_NAMESPACE diff --git a/tools/assistant/lib/qhelpsearchindexwriter_clucene_p.h b/tools/assistant/lib/qhelpsearchindexwriter_clucene_p.h index 91b8abd..db1e533 100644 --- a/tools/assistant/lib/qhelpsearchindexwriter_clucene_p.h +++ b/tools/assistant/lib/qhelpsearchindexwriter_clucene_p.h @@ -69,9 +69,8 @@ QT_BEGIN_NAMESPACE class QCLuceneIndexWriter; -namespace qt { - namespace fulltextsearch { - namespace clucene { +namespace fulltextsearch { +namespace clucene { class QHelpSearchIndexWriter : public QThread { @@ -116,9 +115,9 @@ private: QString m_indexFilesFolder; }; - } // namespace clucene - } // namespace fulltextsearch } // namespace clucene +} // namespace fulltextsearch + QT_END_NAMESPACE diff --git a/tools/assistant/lib/qhelpsearchindexwriter_default.cpp b/tools/assistant/lib/qhelpsearchindexwriter_default.cpp index 6d09fb8..cb3e49c 100644 --- a/tools/assistant/lib/qhelpsearchindexwriter_default.cpp +++ b/tools/assistant/lib/qhelpsearchindexwriter_default.cpp @@ -55,9 +55,8 @@ QT_BEGIN_NAMESPACE -namespace qt { - namespace fulltextsearch { - namespace std { +namespace fulltextsearch { +namespace std { Writer::Writer(const QString &path) : indexPath(path) @@ -379,8 +378,7 @@ QString QHelpSearchIndexWriter::removeNamespace(const QString namespaces, return value; } - } // namespace std - } // namespace fulltextsearch -} // namespace qt +} // namespace std +} // namespace fulltextsearch QT_END_NAMESPACE diff --git a/tools/assistant/lib/qhelpsearchindexwriter_default_p.h b/tools/assistant/lib/qhelpsearchindexwriter_default_p.h index b222203..625cb84 100644 --- a/tools/assistant/lib/qhelpsearchindexwriter_default_p.h +++ b/tools/assistant/lib/qhelpsearchindexwriter_default_p.h @@ -65,9 +65,8 @@ QT_BEGIN_NAMESPACE -namespace qt { - namespace fulltextsearch { - namespace std { +namespace fulltextsearch { +namespace std { class Writer { @@ -123,9 +122,8 @@ private: QString m_indexFilesFolder; }; - } // namespace std - } // namespace fulltextsearch -} // namespace qt +} // namespace std +} // namespace fulltextsearch QT_END_NAMESPACE diff --git a/tools/configure/configure.pro b/tools/configure/configure.pro index 243183c..91de7c2 100644 --- a/tools/configure/configure.pro +++ b/tools/configure/configure.pro @@ -3,8 +3,8 @@ DESTDIR = ../.. CONFIG += console flat CONFIG -= moc qt -DEFINES = UNICODE QT_NODLL QT_NO_CODECS QT_NO_TEXTCODEC QT_NO_UNICODETABLES QT_LITE_COMPONENT QT_NO_STL QT_NO_COMPRESS QT_BUILD_QMAKE QT_NO_THREAD QT_NO_QOBJECT _CRT_SECURE_NO_DEPRECATE - +DEFINES = UNICODE QT_NODLL QT_NO_CODECS QT_NO_TEXTCODEC QT_NO_UNICODETABLES QT_LITE_COMPONENT QT_NO_STL QT_NO_COMPRESS QT_NO_THREAD QT_NO_QOBJECT _CRT_SECURE_NO_DEPRECATE +DEFINES += QT_BOOTSTRAPPED win32 : LIBS += -lole32 -ladvapi32 win32-msvc.net | win32-msvc2* : QMAKE_CXXFLAGS += /EHsc @@ -27,6 +27,7 @@ INCPATH += $$QT_SOURCE_TREE/src/corelib/arch/generic \ $$QT_SOURCE_TREE/src/corelib/global \ $$QT_BUILD_TREE/include \ $$QT_BUILD_TREE/include/QtCore \ + $$QT_BUILD_TREE/tools/shared HEADERS = configureapp.h environment.h tools.h\ $$QT_SOURCE_TREE/src/corelib/tools/qbytearray.h \ @@ -58,7 +59,11 @@ HEADERS = configureapp.h environment.h tools.h\ $$QT_SOURCE_TREE/src/corelib/tools/qstring.h \ $$QT_SOURCE_TREE/src/corelib/tools/qstringlist.h \ $$QT_SOURCE_TREE/src/corelib/tools/qstringmatcher.h \ - $$QT_SOURCE_TREE/src/corelib/tools/qunicodetables_p.h + $$QT_SOURCE_TREE/src/corelib/tools/qunicodetables_p.h \ + $$QT_SOURCE_TREE/src/corelib/xml/qxmlstream.h \ + $$QT_SOURCE_TREE/src/corelib/xml/qxmlutils_p.h \ + $$QT_SOURCE_TREE/tools/shared/symbian/epocroot.h \ + $$QT_SOURCE_TREE/tools/shared/windows/registry.h SOURCES = main.cpp configureapp.cpp environment.cpp tools.cpp \ @@ -102,7 +107,11 @@ SOURCES = main.cpp configureapp.cpp environment.cpp tools.cpp \ $$QT_SOURCE_TREE/src/corelib/tools/qpoint.cpp \ $$QT_SOURCE_TREE/src/corelib/tools/qrect.cpp \ $$QT_SOURCE_TREE/src/corelib/kernel/qmetatype.cpp \ - $$QT_SOURCE_TREE/src/corelib/global/qmalloc.cpp + $$QT_SOURCE_TREE/src/corelib/global/qmalloc.cpp \ + $$QT_SOURCE_TREE/src/corelib/xml/qxmlstream.cpp \ + $$QT_SOURCE_TREE/src/corelib/xml/qxmlutils.cpp \ + $$QT_SOURCE_TREE/tools/shared/symbian/epocroot.cpp \ + $$QT_SOURCE_TREE/tools/shared/windows/registry.cpp win32:SOURCES += $$QT_SOURCE_TREE/src/corelib/io/qfsfileengine_win.cpp diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp index 77b2f66..8c2a015 100644 --- a/tools/configure/configureapp.cpp +++ b/tools/configure/configureapp.cpp @@ -247,7 +247,7 @@ Configure::Configure( int& argc, char** argv ) dictionary[ "PHONON" ] = "auto"; dictionary[ "PHONON_BACKEND" ] = "yes"; dictionary[ "MULTIMEDIA" ] = "yes"; - dictionary[ "AUDIO_BACKEND" ] = "yes"; + dictionary[ "AUDIO_BACKEND" ] = "auto"; dictionary[ "DIRECTSHOW" ] = "no"; dictionary[ "WEBKIT" ] = "auto"; dictionary[ "DECLARATIVE" ] = "auto"; @@ -2068,6 +2068,52 @@ bool Configure::checkAvailability(const QString &part) available = (dictionary.value("QMAKESPEC") == "win32-msvc2005") || (dictionary.value("QMAKESPEC") == "win32-msvc2008") || (dictionary.value("QMAKESPEC") == "win32-g++"); } else if (part == "DECLARATIVE") { available = QFile::exists(sourcePath + "/src/declarative/qml/qmlcomponent.h"); + } else if (part == "AUDIO_BACKEND") { + available = true; + if (dictionary.contains("XQMAKESPEC") && dictionary["XQMAKESPEC"].startsWith("symbian")) { + QString epocRoot = Environment::symbianEpocRoot(); + const QDir epocRootDir(epocRoot); + if (epocRootDir.exists()) { + QStringList paths; + paths << "epoc32/release/armv5/lib/mmfdevsound.dso" + << "epoc32/release/armv5/lib/mmfdevsound.lib" + << "epoc32/release/winscw/udeb/mmfdevsound.dll" + << "epoc32/release/winscw/udeb/mmfdevsound.lib" + << "epoc32/include/mmf/server/sounddevice.h"; + + QStringList::iterator i = paths.begin(); + while (i != paths.end()) { + const QString &path = epocRoot + *i; + if (QFile::exists(path)) + i = paths.erase(i); + else + ++i; + } + + available = (paths.size() == 0); + if (!available) { + if (epocRoot.isNull() || epocRoot == "") + epocRoot = "<empty string>"; + cout << endl + << "The QtMultimedia audio backend will not be built because required" << endl + << "support for CMMFDevSound was not found in the SDK." << endl + << "The SDK which was examined was located at the following path:" << endl + << " " << epocRoot << endl + << "The following required files were missing from the SDK:" << endl; + QString path; + foreach (path, paths) + cout << " " << path << endl; + cout << endl; + } + } else { + cout << endl + << "The SDK root was determined to be '" << epocRoot << "'." << endl + << "This directory was not found, so the SDK could not be checked for" << endl + << "CMMFDevSound support. The QtMultimedia audio backend will therefore" << endl + << "not be built." << endl << endl; + available = false; + } + } } return available; @@ -2156,6 +2202,8 @@ void Configure::autoDetection() dictionary["WEBKIT"] = checkAvailability("WEBKIT") ? "yes" : "no"; if (dictionary["DECLARATIVE"] == "auto") dictionary["DECLARATIVE"] = checkAvailability("DECLARATIVE") ? "yes" : "no"; + if (dictionary["AUDIO_BACKEND"] == "auto") + dictionary["AUDIO_BACKEND"] = checkAvailability("AUDIO_BACKEND") ? "yes" : "no"; // Qt/WinCE remote test application if (dictionary["CETEST"] == "auto") @@ -2268,24 +2316,31 @@ void Configure::generateBuildKey() QString build32Key = buildKey + "Windows " + compiler + " %1 " + build_options.join(" ") + " " + build_defines.join(" "); QString build64Key = buildKey + "Windows x64 " + compiler + " %1 " + build_options.join(" ") + " " + build_defines.join(" "); + QString buildSymbianKey = buildKey + "Symbian " + build_options.join(" ") + " " + build_defines.join(" "); build32Key = build32Key.simplified(); build64Key = build64Key.simplified(); - build32Key.prepend("# define "); - build64Key.prepend("# define "); + buildSymbianKey = buildSymbianKey.simplified(); + build32Key.prepend("# define "); + build64Key.prepend("# define "); + buildSymbianKey.prepend("# define "); - QString buildkey = // Debug builds - "#if (defined(_DEBUG) || defined(DEBUG))\n" - "# if (defined(WIN64) || defined(_WIN64) || defined(__WIN64__))\n" + QString buildkey = "#if defined(__SYMBIAN32__)\n" + + buildSymbianKey + "\"\n" + "#else\n" + // Debug builds + "# if (defined(_DEBUG) || defined(DEBUG))\n" + "# if (defined(WIN64) || defined(_WIN64) || defined(__WIN64__))\n" + build64Key.arg("debug") + "\"\n" - "# else\n" + "# else\n" + build32Key.arg("debug") + "\"\n" - "# endif\n" - "#else\n" + "# endif\n" + "# else\n" // Release builds - "# if (defined(WIN64) || defined(_WIN64) || defined(__WIN64__))\n" + "# if (defined(WIN64) || defined(_WIN64) || defined(__WIN64__))\n" + build64Key.arg("release") + "\"\n" - "# else\n" + "# else\n" + build32Key.arg("release") + "\"\n" + "# endif\n" "# endif\n" "#endif\n"; diff --git a/tools/configure/environment.cpp b/tools/configure/environment.cpp index af6f9e5..e93f9a0 100644 --- a/tools/configure/environment.cpp +++ b/tools/configure/environment.cpp @@ -60,6 +60,8 @@ using namespace std; #include <qt_windows.h> #endif +#include <symbian/epocroot.h> // from tools/shared +#include <windows/registry.h> // from tools/shared QT_BEGIN_NAMESPACE @@ -97,126 +99,6 @@ CompilerInfo *Environment::compilerInfo(Compiler compiler) } /*! - Returns the path part of a registry key. - Ei. - For a key - "Software\\Microsoft\\VisualStudio\\8.0\\Setup\\VC\\ProductDir" - it returns - "Software\\Microsoft\\VisualStudio\\8.0\\Setup\\VC\\" -*/ -QString Environment::keyPath(const QString &rKey) -{ - int idx = rKey.lastIndexOf(QLatin1Char('\\')); - if (idx == -1) - return QString(); - return rKey.left(idx + 1); -} - -/*! - Returns the name part of a registry key. - Ei. - For a key - "Software\\Microsoft\\VisualStudio\\8.0\\Setup\\VC\\ProductDir" - it returns - "ProductDir" -*/ -QString Environment::keyName(const QString &rKey) -{ - int idx = rKey.lastIndexOf(QLatin1Char('\\')); - if (idx == -1) - return rKey; - - QString res(rKey.mid(idx + 1)); - if (res == "Default" || res == ".") - res = ""; - return res; -} - -/*! - Returns a registry keys value in string form. - If the registry key does not exist, or cannot be accessed, a - QString() is returned. -*/ -QString Environment::readRegistryKey(HKEY parentHandle, const QString &rSubkey) -{ -#ifndef Q_OS_WIN32 - return QString(); -#else - QString rSubkeyName = keyName(rSubkey); - QString rSubkeyPath = keyPath(rSubkey); - - HKEY handle = 0; - LONG res = RegOpenKeyEx(parentHandle, (wchar_t*)rSubkeyPath.utf16(), 0, KEY_READ, &handle); - if (res != ERROR_SUCCESS) - return QString(); - - // get the size and type of the value - DWORD dataType; - DWORD dataSize; - res = RegQueryValueEx(handle, (wchar_t*)rSubkeyName.utf16(), 0, &dataType, 0, &dataSize); - if (res != ERROR_SUCCESS) { - RegCloseKey(handle); - return QString(); - } - - // get the value - QByteArray data(dataSize, 0); - res = RegQueryValueEx(handle, (wchar_t*)rSubkeyName.utf16(), 0, 0, - reinterpret_cast<unsigned char*>(data.data()), &dataSize); - if (res != ERROR_SUCCESS) { - RegCloseKey(handle); - return QString(); - } - - QString result; - switch (dataType) { - case REG_EXPAND_SZ: - case REG_SZ: { - result = QString::fromWCharArray(((const wchar_t *)data.constData())); - break; - } - - case REG_MULTI_SZ: { - QStringList l; - int i = 0; - for (;;) { - QString s = QString::fromWCharArray((const wchar_t *)data.constData() + i); - i += s.length() + 1; - - if (s.isEmpty()) - break; - l.append(s); - } - result = l.join(", "); - break; - } - - case REG_NONE: - case REG_BINARY: { - result = QString::fromWCharArray((const wchar_t *)data.constData(), data.size() / 2); - break; - } - - case REG_DWORD_BIG_ENDIAN: - case REG_DWORD: { - Q_ASSERT(data.size() == sizeof(int)); - int i; - memcpy((char*)&i, data.constData(), sizeof(int)); - result = QString::number(i); - break; - } - - default: - qWarning("QSettings: unknown data %d type in windows registry", dataType); - break; - } - - RegCloseKey(handle); - return result; -#endif -} - -/*! Returns the qmakespec for the compiler detected on the system. */ QString Environment::detectQMakeSpec() @@ -579,4 +461,10 @@ bool Environment::rmdir(const QString &name) return result; } +QString Environment::symbianEpocRoot() +{ + // Call function defined in tools/shared/symbian/epocroot.h + return ::epocRoot(); +} + QT_END_NAMESPACE diff --git a/tools/configure/environment.h b/tools/configure/environment.h index 2d0eafd..b1cbe3a 100644 --- a/tools/configure/environment.h +++ b/tools/configure/environment.h @@ -71,13 +71,12 @@ public: static bool cpdir(const QString &srcDir, const QString &destDir); static bool rmdir(const QString &name); + static QString symbianEpocRoot(); + private: static Compiler detectedCompiler; static CompilerInfo *compilerInfo(Compiler compiler); - static QString keyPath(const QString &rKey); - static QString keyName(const QString &rKey); - static QString readRegistryKey(HKEY parentHandle, const QString &rSubkey); }; diff --git a/tools/configure/tools.cpp b/tools/configure/tools.cpp index aea2713..c4625af 100644 --- a/tools/configure/tools.cpp +++ b/tools/configure/tools.cpp @@ -146,6 +146,7 @@ void Tools::checkLicense(QMap<QString,QString> &dictionary, QMap<QString,QString if (products == 'B') { dictionary["EDITION"] = "Evaluation"; dictionary["QT_EDITION"] = "QT_EDITION_EVALUATION"; + licenseType = "Evaluation"; } } @@ -212,7 +213,7 @@ void Tools::checkLicense(QMap<QString,QString> &dictionary, QMap<QString,QString } // Override for evaluation licenses - if (dictionary["Edition"] == "Evaluation") + if (dictionary["EDITION"] == "Evaluation") dictionary["LICENSE_EXTENSION"] = "-EVALUATION"; if (QFile::exists(dictionary["QT_SOURCE_TREE"] + "/.LICENSE")) { diff --git a/tools/qtestlib/wince/cetest/activesyncconnection.cpp b/tools/qtestlib/wince/cetest/activesyncconnection.cpp index 56fb173..98062ed 100644 --- a/tools/qtestlib/wince/cetest/activesyncconnection.cpp +++ b/tools/qtestlib/wince/cetest/activesyncconnection.cpp @@ -443,6 +443,145 @@ bool ActiveSyncConnection::execute(QString program, QString arguments, int timeo return result; } +bool ActiveSyncConnection::setDeviceAwake(bool activate, int *returnValue) +{ + if (!isConnected()) { + qWarning("Cannot execute, connect to device first!"); + return false; + } + bool result = false; + + // If we want to wait, we have to use CeRapiInvoke, as CeCreateProcess has no way to wait + // until the process ends. The lib must have been build and also deployed already. + if (!isConnected() && !connect()) + return false; + + HRESULT res = S_OK; + + //SYSTEM_POWER_STATUS_EX systemPowerState; + + //res = CeGetSystemPowerStatusEx(&systemPowerState, true); + + QString dllLocation = "\\Windows\\QtRemote.dll"; + QString functionName = "qRemoteToggleUnattendedPowerMode"; + + DWORD outputSize; + BYTE* output; + IRAPIStream *stream; + int returned = 0; + int toggle = int(activate); + + res = CeRapiInvoke(dllLocation.utf16(), functionName.utf16(), 0, 0, &outputSize, &output, &stream, 0); + if (S_OK != res) { + DWORD ce_error = CeGetLastError(); + if (S_OK != ce_error) { + qWarning("Error invoking %s on %s: %s", qPrintable(functionName), + qPrintable(dllLocation), strwinerror(ce_error).constData()); + } else { + qWarning("Error: %s on %s unexpectedly returned %d", qPrintable(functionName), + qPrintable(dllLocation), res); + } + } else { + DWORD written; + + if (S_OK != stream->Write(&toggle, sizeof(toggle), &written)) { + qWarning(" Could not write toggle option to process"); + return false; + } + + if (S_OK != stream->Read(&returned, sizeof(returned), &written)) { + qWarning(" Could not access return value of process"); + } + else + result = true; + } + + if (returnValue) + *returnValue = returned; + + return result; +} + +bool ActiveSyncConnection::resetDevice() +{ + if (!isConnected()) { + qWarning("Cannot execute, connect to device first!"); + return false; + } + + bool result = false; + if (!isConnected() && !connect()) + return false; + + QString dllLocation = "\\Windows\\QtRemote.dll"; + QString functionName = "qRemoteSoftReset"; + + DWORD outputSize; + BYTE* output; + IRAPIStream *stream; + + int returned = 0; + + HRESULT res = CeRapiInvoke(dllLocation.utf16(), functionName.utf16(), 0, 0, &outputSize, &output, &stream, 0); + if (S_OK != res) { + DWORD ce_error = CeGetLastError(); + if (S_OK != ce_error) { + qWarning("Error invoking %s on %s: %s", qPrintable(functionName), + qPrintable(dllLocation), strwinerror(ce_error).constData()); + } else { + qWarning("Error: %s on %s unexpectedly returned %d", qPrintable(functionName), + qPrintable(dllLocation), res); + } + } else { + result = true; + } + return result; +} + +bool ActiveSyncConnection::toggleDevicePower(int *returnValue) +{ + if (!isConnected()) { + qWarning("Cannot execute, connect to device first!"); + return false; + } + + bool result = false; + if (!isConnected() && !connect()) + return false; + + QString dllLocation = "\\Windows\\QtRemote.dll"; + QString functionName = "qRemotePowerButton"; + + DWORD outputSize; + BYTE* output; + IRAPIStream *stream; + int returned = 0; + + HRESULT res = CeRapiInvoke(dllLocation.utf16(), functionName.utf16(), 0, 0, &outputSize, &output, &stream, 0); + if (S_OK != res) { + DWORD ce_error = CeGetLastError(); + if (S_OK != ce_error) { + qWarning("Error invoking %s on %s: %s", qPrintable(functionName), + qPrintable(dllLocation), strwinerror(ce_error).constData()); + } else { + qWarning("Error: %s on %s unexpectedly returned %d", qPrintable(functionName), + qPrintable(dllLocation), res); + } + } else { + DWORD written; + if (S_OK != stream->Read(&returned, sizeof(returned), &written)) { + qWarning(" Could not access return value of process"); + } + else { + result = true; + } + } + + if (returnValue) + *returnValue = returned; + return result; +} + bool ActiveSyncConnection::createDirectory(const QString &path, bool deleteBefore) { if (deleteBefore) diff --git a/tools/qtestlib/wince/cetest/activesyncconnection.h b/tools/qtestlib/wince/cetest/activesyncconnection.h index 1891514..4502fc7 100644 --- a/tools/qtestlib/wince/cetest/activesyncconnection.h +++ b/tools/qtestlib/wince/cetest/activesyncconnection.h @@ -79,6 +79,9 @@ public: bool createDirectory(const QString&, bool deleteBefore=false); bool execute(QString program, QString arguments = QString(), int timeout = -1, int *returnValue = NULL); + bool resetDevice(); + bool toggleDevicePower(int *returnValue = NULL); + bool setDeviceAwake(bool activate, int *returnValue = NULL); private: bool connected; }; diff --git a/tools/qtestlib/wince/cetest/main.cpp b/tools/qtestlib/wince/cetest/main.cpp index 146cc5a..9fe5f02 100644 --- a/tools/qtestlib/wince/cetest/main.cpp +++ b/tools/qtestlib/wince/cetest/main.cpp @@ -45,6 +45,9 @@ # include "activesyncconnection.h" #endif +const int SLEEP_AFTER_RESET = 60000; // sleep for 1 minute +const int SLEEP_RECONNECT = 2000; // sleep for 2 seconds before trying another reconnect + #include "deployment.h" #include <option.h> #include <project.h> @@ -123,6 +126,8 @@ void usage() " -debug : Test debug version[default]\n" " -release : Test release version\n" " -libpath <path> : Remote path to deploy Qt libraries to\n" + " -reset : Reset device before starting a test\n" + " -awake : Device does not go sleep mode\n" " -qt-delete : Delete the Qt libraries after execution\n" " -project-delete : Delete the project file(s) after execution\n" " -delete : Delete everything deployed after execution\n" @@ -152,6 +157,8 @@ int main(int argc, char **argv) int timeout = -1; bool cleanupQt = false; bool cleanupProject = false; + bool deviceReset = false; + bool keepAwake = false; for (int i=1; i<arguments.size(); ++i) { if (arguments.at(i).toLower() == QLatin1String("-help") @@ -196,6 +203,10 @@ int main(int argc, char **argv) } else if (arguments.at(i).toLower() == QLatin1String("-delete")) { cleanupQt = true; cleanupProject = true; + } else if (arguments.at(i).toLower() == QLatin1String("-reset")) { + deviceReset = true; + } else if (arguments.at(i).toLower() == QLatin1String("-awake")) { + keepAwake = true; } else if (arguments.at(i).toLower() == QLatin1String("-conf")) { if (++i == arguments.size()) { cout << "Error: No qt.conf file specified!" << endl; @@ -353,6 +364,43 @@ int main(int argc, char **argv) cout << "Error: Could not copy file(s) to device" << endl; return -1; } + // device power mode + if (keepAwake) + { + int retVal = 0; + if (!connection.setDeviceAwake(true, &retVal)) { + cout << "Error: Could not set unattended mode on device" << endl; + return -1; + } + } + + // reset device + if (deviceReset) + { + if (!connection.resetDevice()) { + //if (!connection.toggleDevicePower( &retVal)) { + cout << "Error: Could not reset the device" << endl; + return -1; + } + cout << " Entering sleep after reset for " << SLEEP_AFTER_RESET / 1000 << " seconds ... " << endl; + Sleep(SLEEP_AFTER_RESET); + cout << " ... woke up. " << endl; + connection.disconnect(); + // reconnect after reset + int retryCount = 21; + while (--retryCount) + { + if (!connection.connect()) + Sleep(SLEEP_RECONNECT); + else + break; + } + if (!connection.isConnected()) + { + cout << "Error: Could not connect to device!" << endl; + return -1; + } + } // launch launchArguments.append("-o"); diff --git a/tools/qtestlib/wince/remotelib/commands.cpp b/tools/qtestlib/wince/remotelib/commands.cpp index 4244424..88bf9e6 100644 --- a/tools/qtestlib/wince/remotelib/commands.cpp +++ b/tools/qtestlib/wince/remotelib/commands.cpp @@ -39,6 +39,9 @@ ** ****************************************************************************/ #include "commands.h" +#include <Pm.h> +#include <Pmpolicy.h> + #define CLEAN_FAIL(a) {delete appName; \ delete arguments; \ @@ -124,3 +127,86 @@ bool qRemoteExecute(const wchar_t* program, const wchar_t* arguments, int *retur } return true; } +/** +\brief Reset the device. +*/ +int qRemoteSoftReset(DWORD, BYTE*, DWORD*, BYTE**, IRAPIStream* stream) +{ + //POWER_STATE_ON On state + //POWER_STATE_OFF Off state + //POWER_STATE_CRITICAL Critical state + //POWER_STATE_BOOT Boot state + //POWER_STATE_IDLE Idle state + //POWER_STATE_SUSPEND Suspend state + //POWER_STATE_RESET Reset state + + DWORD returnValue = SetSystemPowerState(0, POWER_STATE_RESET, POWER_FORCE); + return returnValue; +} + +/** +\brief Toggle the unattended powermode of the device +*/ +int qRemoteToggleUnattendedPowerMode(DWORD, BYTE*, DWORD*, BYTE**, IRAPIStream* stream) +{ + if (!stream) + return -1; + + DWORD bytesRead; + int toggleVal = 0; + int returnValue = S_OK; + + if (S_OK != stream->Read(&toggleVal, sizeof(toggleVal), &bytesRead)) + return -2; + + //PPN_REEVALUATESTATE 0x0001 Reserved. Set dwData to zero (0). + //PPN_POWERCHANGE 0x0002 Reserved. Set dwData to zero (0). + //PPN_UNATTENDEDMODE 0x0003 Set dwData to TRUE or FALSE. + //PPN_SUSPENDKEYPRESSED or + //PPN_POWERBUTTONPRESSED 0x0004 Reserved. Set dwData to zero (0). + //PPN_SUSPENDKEYRELEASED 0x0005 Reserved. Set dwData to zero (0). + //PPN_APPBUTTONPRESSED 0x0006 Reserved. Set dwData to zero (0). + //PPN_OEMBASE Greater than or equal to 0x10000 + //You can define higher values, such as 0x10001, 0x10002, and so on. + // Reserved. Set dwData to zero (0). + returnValue = PowerPolicyNotify(PPN_UNATTENDEDMODE, toggleVal); + + if (S_OK != stream->Write(&returnValue, sizeof(returnValue), &bytesRead)) + return -3; + else + return S_OK; +} + +/** +\brief Virtually press the power button of the device +*/ +int qRemotePowerButton(DWORD, BYTE*, DWORD*, BYTE**, IRAPIStream* stream) +{ + if (!stream) + return -1; + + DWORD bytesRead; + int toggleVal = 0; + int returnValue = S_OK; + + if (S_OK != stream->Read(&toggleVal, sizeof(toggleVal), &bytesRead)) + return -2; + + //PPN_REEVALUATESTATE 0x0001 Reserved. Set dwData to zero (0). + //PPN_POWERCHANGE 0x0002 Reserved. Set dwData to zero (0). + //PPN_UNATTENDEDMODE 0x0003 Set dwData to TRUE or FALSE. + //PPN_SUSPENDKEYPRESSED or + //PPN_POWERBUTTONPRESSED 0x0004 Reserved. Set dwData to zero (0). + //PPN_SUSPENDKEYRELEASED 0x0005 Reserved. Set dwData to zero (0). + //PPN_APPBUTTONPRESSED 0x0006 Reserved. Set dwData to zero (0). + //PPN_OEMBASE Greater than or equal to 0x10000 + //You can define higher values, such as 0x10001, 0x10002, and so on. + // Reserved. Set dwData to zero (0). + returnValue = PowerPolicyNotify(PPN_POWERBUTTONPRESSED, 0); + + if (S_OK != stream->Write(&returnValue, sizeof(returnValue), &bytesRead)) + return -3; + else + return S_OK; +} + diff --git a/tools/qtestlib/wince/remotelib/commands.h b/tools/qtestlib/wince/remotelib/commands.h index c5cc926..8f202c8 100644 --- a/tools/qtestlib/wince/remotelib/commands.h +++ b/tools/qtestlib/wince/remotelib/commands.h @@ -45,6 +45,9 @@ extern "C" { int __declspec(dllexport) qRemoteLaunch(DWORD, BYTE*, DWORD*, BYTE**, IRAPIStream*); + int __declspec(dllexport) qRemoteSoftReset(DWORD, BYTE*, DWORD*, BYTE**, IRAPIStream* stream); + int __declspec(dllexport) qRemoteToggleUnattendedPowerMode(DWORD, BYTE*, DWORD*, BYTE**, IRAPIStream* stream); + int __declspec(dllexport) qRemotePowerButton(DWORD, BYTE*, DWORD*, BYTE**, IRAPIStream* stream); bool __declspec(dllexport) qRemoteExecute(const wchar_t* program, const wchar_t* arguments = NULL, int *returnValue = NULL , DWORD* error = NULL, int timeout = -1); } diff --git a/tools/shared/symbian/epocroot.cpp b/tools/shared/symbian/epocroot.cpp new file mode 100644 index 0000000..071477d --- /dev/null +++ b/tools/shared/symbian/epocroot.cpp @@ -0,0 +1,230 @@ +/**************************************************************************** +** +** 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 qmake application 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 <iostream> + +#include <QtCore/qdir.h> +#include <QtCore/qxmlstream.h> + +#include "epocroot.h" +#include "../windows/registry.h" + +// Registry key under which the location of the Symbian devices.xml file is +// stored. +// Note that, on 64-bit machines, this key is located under the 32-bit +// compatibility key: +// HKEY_LOCAL_MACHINE\Software\Wow6432Node +#define SYMBIAN_SDKS_REG_SUBKEY "Software\\Symbian\\EPOC SDKs\\CommonPath" + +#ifdef Q_OS_WIN32 +# define SYMBIAN_SDKS_REG_HANDLE HKEY_LOCAL_MACHINE +#else +# define SYMBIAN_SDKS_REG_HANDLE 0 +#endif + +// Value which is populated and returned by the epocRoot() function. +// Stored as a static value in order to avoid unnecessary re-evaluation. +static QString epocRootValue; + +#ifdef QT_BUILD_QMAKE +std::ostream &operator<<(std::ostream &s, const QString &val) { + s << val.toLocal8Bit().data(); + return s; +} +#else +// Operator implemented in configureapp.cpp +std::ostream &operator<<(std::ostream &s, const QString &val); +#endif + +QString getDevicesXmlPath() + { + // Note that the following call will return a null string on platforms other + // than Windows. If support is required on other platforms for devices.xml, + // an alternative mechanism for retrieving the location of this file will + // be required. + return readRegistryKey(SYMBIAN_SDKS_REG_HANDLE, SYMBIAN_SDKS_REG_SUBKEY); + } + +/** + * Checks whether epocRootValue points to an existent directory. + * If not, epocRootValue is set to an empty string and an error message is printed. + */ +void checkEpocRootExists(const QString &source) +{ + if (!epocRootValue.isEmpty()) { + QDir dir(epocRootValue); + if (!dir.exists()) { + std::cerr << "Warning: " << source << " is set to an invalid path: " << epocRootValue << std::endl; + epocRootValue = QString(); + } + } +} + +/** + * Translate path from Windows to Qt format. + */ +static void fixEpocRoot(QString &path) +{ + path.replace("\\", "/"); + + if (path.size() > 1 && path[1] == QChar(':')) { + path = path.mid(2); + } + + if (!path.size() || path[path.size()-1] != QChar('/')) { + path += QChar('/'); + } +} + +/** + * Determine the epoc root for the currently active SDK. + */ +QString epocRoot() +{ + if (epocRootValue.isEmpty()) { + // 1. If environment variable EPOCROOT is set and points to an existent + // directory, this is returned. + epocRootValue = qgetenv("EPOCROOT"); + checkEpocRootExists("EPOCROOT"); + + if (epocRootValue.isEmpty()) { + // 2. The location of devices.xml is specified by a registry key. If this + // file exists, it is parsed. + QString devicesXmlPath = getDevicesXmlPath(); + if (devicesXmlPath.isEmpty()) { + std::cerr << "Error: Symbian SDK registry key not found" << std::endl; + } else { + devicesXmlPath += "/devices.xml"; + QFile devicesFile(devicesXmlPath); + if (devicesFile.open(QIODevice::ReadOnly)) { + + // 3. If the EPOCDEVICE environment variable is set and a corresponding + // entry is found in devices.xml, and its epocroot value points to an + // existent directory, it is returned. + // 4. If a device element marked as default is found in devices.xml and its + // epocroot value points to an existent directory, this is returned. + + const QString epocDeviceValue = qgetenv("EPOCDEVICE"); + bool epocDeviceFound = false; + + QXmlStreamReader xml(&devicesFile); + while (!xml.atEnd()) { + xml.readNext(); + if (xml.isStartElement() && xml.name() == "devices") { + if (xml.attributes().value("version") == "1.0") { + while (!(xml.isEndElement() && xml.name() == "devices") && !xml.atEnd()) { + xml.readNext(); + if (xml.isStartElement() && xml.name() == "device") { + const bool isDefault = xml.attributes().value("default") == "yes"; + const QString id = xml.attributes().value("id").toString(); + const QString name = xml.attributes().value("name").toString(); + const bool epocDeviceMatch = (id + ":" + name) == epocDeviceValue; + epocDeviceFound |= epocDeviceMatch; + + if((epocDeviceValue.isEmpty() && isDefault) || epocDeviceMatch) { + // Found a matching device + while (!(xml.isEndElement() && xml.name() == "device") && !xml.atEnd()) { + xml.readNext(); + if (xml.isStartElement() && xml.name() == "epocroot") { + epocRootValue = xml.readElementText(); + const QString deviceSource = epocDeviceValue.isEmpty() + ? "default device" + : "EPOCDEVICE (" + epocDeviceValue + ")"; + checkEpocRootExists(deviceSource); + } + } + + if (epocRootValue.isEmpty()) + xml.raiseError("No epocroot element found"); + } + } + } + } else { + xml.raiseError("Invalid 'devices' element version"); + } + } + } + if (xml.hasError()) { + std::cerr << "Error: \"" << xml.errorString() << "\" when parsing devices.xml" << std::endl; + } else { + if (epocRootValue.isEmpty()) { + if (!epocDeviceValue.isEmpty()) { + if (epocDeviceFound) { + std::cerr << "Error: missing or invalid epocroot attribute " + << "in device '" << epocDeviceValue << "'"; + } else { + std::cerr << "Error: no device matching EPOCDEVICE (" + << epocDeviceValue << ")"; + } + } else { + if (epocDeviceFound) { + std::cerr << "Error: missing or invalid epocroot attribute " + << "in default device"; + } else { + std::cerr << "Error: no default device"; + } + } + std::cerr << " found in devices.xml file." << std::endl; + } + } + } else { + std::cerr << "Error: could not open file " << devicesXmlPath << std::endl; + } + } + } + + if (epocRootValue.isEmpty()) { + // 5. An empty string is returned. + std::cerr << "Error: failed to find epoc root" << std::endl + << "Either" << std::endl + << " 1. Set EPOCROOT environment variable to a valid value" << std::endl + << " or 2. Ensure that the HKEY_LOCAL_MACHINE\\" SYMBIAN_SDKS_REG_SUBKEY + " registry key is set, and then" << std::endl + << " a. Set EPOCDEVICE environment variable to a valid device" << std::endl + << " or b. Specify a default device in the devices.xml file." << std::endl; + } else { + fixEpocRoot(epocRootValue); + } + } + + return epocRootValue; +} + diff --git a/tools/shared/symbian/epocroot.h b/tools/shared/symbian/epocroot.h new file mode 100644 index 0000000..9846485 --- /dev/null +++ b/tools/shared/symbian/epocroot.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 qmake application 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 SYMBIAN_EPOCROOT_H +#define SYMBIAN_EPOCROOT_H + +#include <QtCore/qstring.h> + +/** + * Determine the epoc root for the currently active SDK. + * + * The algorithm used is as follows: + * 1. If environment variable EPOCROOT is set and points to an existent + * directory, this is returned. + * 2. The location of devices.xml is specified by a registry key. If this + * file exists, it is parsed. + * 3. If the EPOCDEVICE environment variable is set and a corresponding + * entry is found in devices.xml, and its epocroot value points to an + * existent directory, it is returned. + * 4. If a device element marked as default is found in devices.xml and its + * epocroot value points to an existent directory, this is returned. + * 5. An empty string is returned. + * + * Any return value other than the empty string therefore is guaranteed to + * point to an existent directory. + */ +QString epocRoot(); + +#endif // EPOCROOT_H diff --git a/tools/shared/windows/registry.cpp b/tools/shared/windows/registry.cpp new file mode 100644 index 0000000..d342d78 --- /dev/null +++ b/tools/shared/windows/registry.cpp @@ -0,0 +1,161 @@ +/**************************************************************************** +** +** 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 qmake application 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 <QtCore/qstringlist.h> +#include "registry.h" + +/*! + Returns the path part of a registry key. + e.g. + For a key + "Software\\Microsoft\\VisualStudio\\8.0\\Setup\\VC\\ProductDir" + it returns + "Software\\Microsoft\\VisualStudio\\8.0\\Setup\\VC\\" +*/ +static QString keyPath(const QString &rKey) +{ + int idx = rKey.lastIndexOf(QLatin1Char('\\')); + if (idx == -1) + return QString(); + return rKey.left(idx + 1); +} + +/*! + Returns the name part of a registry key. + e.g. + For a key + "Software\\Microsoft\\VisualStudio\\8.0\\Setup\\VC\\ProductDir" + it returns + "ProductDir" +*/ +static QString keyName(const QString &rKey) +{ + int idx = rKey.lastIndexOf(QLatin1Char('\\')); + if (idx == -1) + return rKey; + + QString res(rKey.mid(idx + 1)); + if (res == "Default" || res == ".") + res = ""; + return res; +} + +QString readRegistryKey(HKEY parentHandle, const QString &rSubkey) +{ + QString result; + +#ifdef Q_OS_WIN32 + QString rSubkeyName = keyName(rSubkey); + QString rSubkeyPath = keyPath(rSubkey); + + HKEY handle = 0; + LONG res = RegOpenKeyEx(parentHandle, (wchar_t*)rSubkeyPath.utf16(), 0, KEY_READ, &handle); + + if (res != ERROR_SUCCESS) + return QString(); + + // get the size and type of the value + DWORD dataType; + DWORD dataSize; + res = RegQueryValueEx(handle, (wchar_t*)rSubkeyName.utf16(), 0, &dataType, 0, &dataSize); + if (res != ERROR_SUCCESS) { + RegCloseKey(handle); + return QString(); + } + + // get the value + QByteArray data(dataSize, 0); + res = RegQueryValueEx(handle, (wchar_t*)rSubkeyName.utf16(), 0, 0, + reinterpret_cast<unsigned char*>(data.data()), &dataSize); + if (res != ERROR_SUCCESS) { + RegCloseKey(handle); + return QString(); + } + + switch (dataType) { + case REG_EXPAND_SZ: + case REG_SZ: { + result = QString::fromWCharArray(((const wchar_t *)data.constData())); + break; + } + + case REG_MULTI_SZ: { + QStringList l; + int i = 0; + for (;;) { + QString s = QString::fromWCharArray((const wchar_t *)data.constData() + i); + i += s.length() + 1; + + if (s.isEmpty()) + break; + l.append(s); + } + result = l.join(", "); + break; + } + + case REG_NONE: + case REG_BINARY: { + result = QString::fromWCharArray((const wchar_t *)data.constData(), data.size() / 2); + break; + } + + case REG_DWORD_BIG_ENDIAN: + case REG_DWORD: { + Q_ASSERT(data.size() == sizeof(int)); + int i; + memcpy((char*)&i, data.constData(), sizeof(int)); + result = QString::number(i); + break; + } + + default: + qWarning("QSettings: unknown data %d type in windows registry", dataType); + break; + } + + RegCloseKey(handle); +#endif + + return result; +} + + diff --git a/tools/shared/windows/registry.h b/tools/shared/windows/registry.h new file mode 100644 index 0000000..3896527 --- /dev/null +++ b/tools/shared/windows/registry.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 qmake application 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 WINDOWS_REGISTRY_H +#define WINDOWS_REGISTRY_H + +#include <QtCore/qglobal.h> + +#ifdef Q_OS_WIN32 + #include <QtCore/qt_windows.h> +#else + typedef void* HKEY; +#endif + +#include <QtCore/qstring.h> + +/** + * Read a value from the Windows registry. + * + * If the key is not found, or the registry cannot be accessed (for example + * if this code is compiled for a platform other than Windows), a null + * string is returned. + */ +QString readRegistryKey(HKEY parentHandle, const QString &rSubkey); + +#endif // WINDOWS_REGISTRY_H |