summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiDe Zhang <[email protected]>2022-03-07 18:18:27 +0800
committerVolker Hilsheimer <[email protected]>2022-04-28 09:24:39 +0200
commit7a5d7e8440a1e4beec49b751d0ecacdf55aa45d5 (patch)
tree02c9e23ef79a51097c58481dc4d79584c465b6e2
parent5165b89e2b88e773ae3deba0df9166a75b9ef017 (diff)
Optimize the QPalette::resolve from the other palette
If all the palette's colors are resolved, nothing needs to be done in QPalette::resolve(const QPalette &other). Change-Id: I1573cfa5b5cd1e7eb15f3242aff6ab92e9f8c84b Reviewed-by: Qt CI Bot <[email protected]> Reviewed-by: Volker Hilsheimer <[email protected]>
-rw-r--r--src/gui/kernel/qpalette.cpp14
-rw-r--r--tests/auto/gui/kernel/qpalette/tst_qpalette.cpp8
2 files changed, 22 insertions, 0 deletions
diff --git a/src/gui/kernel/qpalette.cpp b/src/gui/kernel/qpalette.cpp
index 22ba5f3bcd3..5a0bad91599 100644
--- a/src/gui/kernel/qpalette.cpp
+++ b/src/gui/kernel/qpalette.cpp
@@ -921,6 +921,17 @@ qint64 QPalette::cacheKey() const
return (((qint64) d->ser_no) << 32) | ((qint64) (d->detach_no));
}
+static constexpr QPalette::ResolveMask allResolveMask()
+{
+ QPalette::ResolveMask mask = {0};
+ for (int role = 0; role < int(QPalette::NColorRoles); ++role) {
+ for (int grp = 0; grp < int(QPalette::NColorGroups); ++grp) {
+ mask |= (QPalette::ResolveMask(1) << bitPosition(QPalette::ColorGroup(grp), QPalette::ColorRole(role)));
+ }
+ }
+ return mask;
+}
+
/*!
Returns a new QPalette that is a union of this instance and \a other.
Color roles set in this instance take precedence.
@@ -934,6 +945,9 @@ QPalette QPalette::resolve(const QPalette &other) const
return o;
}
+ if (d->resolveMask == allResolveMask())
+ return *this;
+
QPalette palette(*this);
palette.detach();
diff --git a/tests/auto/gui/kernel/qpalette/tst_qpalette.cpp b/tests/auto/gui/kernel/qpalette/tst_qpalette.cpp
index 9ef313f36db..5baec3c180c 100644
--- a/tests/auto/gui/kernel/qpalette/tst_qpalette.cpp
+++ b/tests/auto/gui/kernel/qpalette/tst_qpalette.cpp
@@ -122,6 +122,14 @@ void tst_QPalette::resolve()
QVERIFY(p2ResolvedTo1 != p1);
QVERIFY(p2ResolvedTo1 != p2);
+
+ QPalette p3;
+ // ensure the resolve mask is full
+ for (int r = 0; r < QPalette::NColorRoles; ++r)
+ p3.setBrush(QPalette::All, QPalette::ColorRole(r), Qt::red);
+
+ QPalette p3ResolvedToP1 = p3.resolve(p1);
+ QVERIFY(p3ResolvedToP1.isCopyOf(p3));
}