From daab9e38c3c0087c720a223fe003dff173c2eea6 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Fri, 29 Aug 2014 10:18:04 +0200 Subject: [PATCH] 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 Reviewed-by: Gunnar Sletta --- src/gui/painting/qbrush.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) 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 x; switch(newStyle) {