summaryrefslogtreecommitdiffstats
path: root/src/gui/painting/qbrush.cpp
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@kdab.com>2014-08-29 10:18:04 +0200
committerMarc Mutz <marc.mutz@kdab.com>2016-08-01 11:43:02 +0000
commitdaab9e38c3c0087c720a223fe003dff173c2eea6 (patch)
tree4d8d982b763370b44eb5cae18af9c218783f7585 /src/gui/painting/qbrush.cpp
parent0ec512e90bfc9b11ac5ca99acbdac3b1e83ee961 (diff)
QBrush: optimize detach()
Previously, detach() would detach on every style change. But there are only three QBrushData classes, thus many styles use the same. So instead of checking for style identity, check for style equivalence, where equivalence is defined in terms of use_same_brushdata(). Change-Id: I7548c6022a45e542ca0d3ea00d837cd4ff93df34 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> Reviewed-by: Gunnar Sletta <gunnar@sletta.org>
Diffstat (limited to 'src/gui/painting/qbrush.cpp')
-rw-r--r--src/gui/painting/qbrush.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/gui/painting/qbrush.cpp b/src/gui/painting/qbrush.cpp
index ee1f01e850..acea5682d1 100644
--- a/src/gui/painting/qbrush.cpp
+++ b/src/gui/painting/qbrush.cpp
@@ -569,11 +569,20 @@ void QBrush::cleanUp(QBrushData *x)
QBrushDataPointerDeleter::deleteData(x);
}
+static Q_DECL_CONSTEXPR inline bool use_same_brushdata(Qt::BrushStyle lhs, Qt::BrushStyle rhs)
+{
+ return lhs == rhs // includes Qt::TexturePattern
+ || (lhs >= Qt::NoBrush && lhs <= Qt::DiagCrossPattern && rhs >= Qt::NoBrush && rhs <= Qt::DiagCrossPattern)
+ || (lhs >= Qt::LinearGradientPattern && lhs <= Qt::ConicalGradientPattern && rhs >= Qt::LinearGradientPattern && rhs <= Qt::ConicalGradientPattern)
+ ;
+}
void QBrush::detach(Qt::BrushStyle newStyle)
{
- if (newStyle == d->style && d->ref.load() == 1)
+ if (use_same_brushdata(newStyle, d->style) && d->ref.load() == 1) {
+ d->style = newStyle;
return;
+ }
QScopedPointer<QBrushData> x;
switch(newStyle) {