aboutsummaryrefslogtreecommitdiffstats
path: root/tests/benchmarks
diff options
context:
space:
mode:
authorVitaly Fanaskov <vitaly.fanaskov@qt.io>2019-08-06 15:47:50 +0200
committerVitaly Fanaskov <vitaly.fanaskov@qt.io>2020-03-16 14:33:24 +0100
commit1875ad7f92cad270cc5857d71096a4b46c27c562 (patch)
treef8bfa68c889ea602e14d017e26030401ae7c1dc9 /tests/benchmarks
parentea592334fdf12ce6625106c3f06bb57333690942 (diff)
Introduce new mechanism to manage palette functionality in QML
Main goals of these changes: 1) Add an ability to work with disabled and inactive palettes from QML 2) Eliminate massive code duplication in qtquickcontrols2 module 3) Provide easily extensible architecture for this piece of functionality Architectural part. Palette It was decided to not change existing QPalette, but add thin wrappers around it to provide all required functionality. These wrappers are highly coupled with QPalette class because of using some enum values from it. There are two new classes QQuickPalette and QQuickColorGroup. QQuickPalette class inherits QQuickColorGroup class and represents Active/All color group. QQuickPalette also provides an access to three color groups: Active, Inactive, and Disabled. In order to access colors the special class QQuickPaletteColorProvider is used. This is a wrapper around QPalette that provides some convenience functions. Interface The private property "palette" should be exposed. Implementation All private parts of classes that implement QQuickAbstractPaletteProvider have to inherit QQuickPaletteProviderPrivateBase class. This template class implement all functionality: create palette, resolve dependencies, connect objects etc. This is important to mention that related data is lazily allocatable on demand only. Hence, there is no memory overhead for regular items. Change-Id: I911424b730451b1ad47f68fd8007953b66eddb28 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'tests/benchmarks')
-rw-r--r--tests/benchmarks/quick/colorresolving/colorresolving.pro14
-rw-r--r--tests/benchmarks/quick/colorresolving/data/tst_colorresolving.qml149
-rw-r--r--tests/benchmarks/quick/colorresolving/tst_colorresolving.cpp38
-rw-r--r--tests/benchmarks/quick/quick.pro3
4 files changed, 203 insertions, 1 deletions
diff --git a/tests/benchmarks/quick/colorresolving/colorresolving.pro b/tests/benchmarks/quick/colorresolving/colorresolving.pro
new file mode 100644
index 0000000000..dc238caf44
--- /dev/null
+++ b/tests/benchmarks/quick/colorresolving/colorresolving.pro
@@ -0,0 +1,14 @@
+TEMPLATE = app
+TARGET = tst_colorresolving
+CONFIG += qmltestcase
+
+macos:CONFIG -= app_bundle
+
+SOURCES += \
+ $$PWD/tst_colorresolving.cpp
+
+OTHER_FILES += \
+ $$PWD/data/*.qml
+
+TESTDATA += \
+ $$PWD/data/tst_*
diff --git a/tests/benchmarks/quick/colorresolving/data/tst_colorresolving.qml b/tests/benchmarks/quick/colorresolving/data/tst_colorresolving.qml
new file mode 100644
index 0000000000..37aecaa3a4
--- /dev/null
+++ b/tests/benchmarks/quick/colorresolving/data/tst_colorresolving.qml
@@ -0,0 +1,149 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtTest 1.2
+import QtQuick 6.0
+
+TestCase {
+ id: testCase
+ width: 800
+ height: 600
+ visible: true
+ when: windowShown
+
+ property var items: []
+ property int items_count: 1000
+ property int itemWidth : 50
+ property int itemHeight: 50
+
+ // A reference point (added upon request)
+ function benchmark_do_nothing_with_palettes() {}
+
+ // This test passes through all items in tree to resolve a color. No extra palettes created.
+ // Should be blazingly fast (approx. 0.01 msecs for 999 items).
+ function benchmark_color_lookup() {
+ // Make last item "visible" and create its palette
+ items[items_count - 1].color = items[items_count - 1].palette.button
+
+ compare(items[0].palette.button, items[items_count - 1].palette.button,
+ "Color is not propagated to the last element.")
+ }
+
+ // This test creates palettes for all elements in the tree.
+ function benchmark_create_all_palettes(data) {
+ populate_palettes()
+ check_palettes()
+ }
+
+ // This test creates and resolves palettes for all elements in the tree.
+ function benchmark_create_and_resolve_all_palettes() {
+ populate_palettes()
+ resolve_palettes()
+ check_palettes()
+ }
+
+ function init() {
+ // Re-create all items on each iteration of the benchmark.
+
+ var componentStr = "import QtQuick 6.0;
+
+ Rectangle {
+ x: mapFromItem(testCase, testCase.randomX(), testCase.randomY()).x
+ y: mapFromItem(testCase, testCase.randomX(), testCase.randomY()).y
+
+ color: \"#7F696969\"
+
+ width: testCase.itemWidth
+ height: testCase.itemHeight
+ }";
+ items.push(createTemporaryQmlObject(componentStr, testCase))
+ for (var i = 1; i < items_count; ++i) {
+ items.push(createTemporaryQmlObject(componentStr, items[i - 1]))
+ }
+
+ // Create a pallet for item 0
+ items[0].palette.button = randomRgba()
+
+ // Make item "visible" (can be overlapped by children)
+ items[0].color = items[0].palette.button
+ }
+
+ function cleanup() {
+ // Explicitly remove all "temporary" items to make sure that a memory
+ // will be released after each iteration of the benchmark.
+ for (var i = 0; i < items_count; ++i) {
+ items[i].destroy();
+ }
+
+ items = [];
+ }
+
+ function randomColorComponent() {
+ return Math.floor(Math.random() * 256) / 255.0;
+ }
+
+ function randomRgba() {
+ return Qt.rgba(randomColorComponent(),
+ randomColorComponent(),
+ randomColorComponent(),
+ randomColorComponent());
+ }
+
+ function randomCoordinate(len, itemLen) { return Math.floor(Math.random() * (len - itemLen + 1)); }
+ function randomX() { return randomCoordinate(width, itemWidth); }
+ function randomY() { return randomCoordinate(height, itemHeight); }
+
+ function populate_palettes() {
+ for (var i = 1; i < items_count; ++i) {
+ items[i].color = items[i].palette.button
+ }
+ }
+
+ function check_palettes() {
+ for (var j = 1; j < items_count; ++j) {
+ compare(items[j - 1].palette.button, items[j].palette.button,
+ "Color is not propagated to the next child element.")
+ }
+ }
+
+ function resolve_palettes() {
+ // The loop is just in case. Doesn't affect the benchmark
+ do {
+ var randomColor = randomRgba()
+ } while (items[0].palette.button === randomColor)
+
+ items[0].palette.button = randomColor
+ }
+}
diff --git a/tests/benchmarks/quick/colorresolving/tst_colorresolving.cpp b/tests/benchmarks/quick/colorresolving/tst_colorresolving.cpp
new file mode 100644
index 0000000000..1ec4781d6c
--- /dev/null
+++ b/tests/benchmarks/quick/colorresolving/tst_colorresolving.cpp
@@ -0,0 +1,38 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtQuickTest/quicktest.h>
+QUICK_TEST_MAIN(tst_colorresolving)
diff --git a/tests/benchmarks/quick/quick.pro b/tests/benchmarks/quick/quick.pro
index 87df78bd2f..f6de5ec287 100644
--- a/tests/benchmarks/quick/quick.pro
+++ b/tests/benchmarks/quick/quick.pro
@@ -1,4 +1,5 @@
TEMPLATE = subdirs
SUBDIRS += \
- events
+ events \
+ colorresolving