summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Rødal <samuel.rodal@nokia.com>2010-09-28 10:24:13 (GMT)
committerSamuel Rødal <samuel.rodal@nokia.com>2010-09-28 14:52:54 (GMT)
commita33ef62469fd71bec7ed21e3a0ce7c2b12464a2d (patch)
treece1e88d2bcd680968d209afbb41d79ff5eca6740
parent8ac7817f7a294428f4eda3c10f519e14fe9d71a0 (diff)
downloadQt-a33ef62469fd71bec7ed21e3a0ce7c2b12464a2d.zip
Qt-a33ef62469fd71bec7ed21e3a0ce7c2b12464a2d.tar.gz
Qt-a33ef62469fd71bec7ed21e3a0ce7c2b12464a2d.tar.bz2
Fixed performance issue in QML clipping with OpenGL 2.0 paint engine.
Change 4c515ceb fixed Intersect and Unite-clipping after doing setClipping(false), but also introduced a performance problem. If there was no pre-existing clip we'd convert IntersectClips to ReplaceClips, which is unnecessary since the paint engines already handle this correctly. IntersectClips can be handled much more efficiently in the OpenGL 2 paint engine for example. We only need to convert to ReplaceClip when someone has used setClipEnabled(false) which is anyways expensive and not recommended. Reviewed-by: Trond
-rw-r--r--src/gui/painting/qpainter.cpp8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp
index 12be93e..5fbe3ed 100644
--- a/src/gui/painting/qpainter.cpp
+++ b/src/gui/painting/qpainter.cpp
@@ -2717,7 +2717,7 @@ void QPainter::setClipRect(const QRectF &rect, Qt::ClipOperation op)
Q_D(QPainter);
if (d->extended) {
- if (!hasClipping() && (op == Qt::IntersectClip || op == Qt::UniteClip))
+ if ((!d->state->clipEnabled && op != Qt::NoClip) || (d->state->clipOperation == Qt::NoClip && op == Qt::UniteClip))
op = Qt::ReplaceClip;
if (!d->engine) {
@@ -2775,7 +2775,7 @@ void QPainter::setClipRect(const QRect &rect, Qt::ClipOperation op)
return;
}
- if (!hasClipping() && (op == Qt::IntersectClip || op == Qt::UniteClip))
+ if ((!d->state->clipEnabled && op != Qt::NoClip) || (d->state->clipOperation == Qt::NoClip && op == Qt::UniteClip))
op = Qt::ReplaceClip;
if (d->extended) {
@@ -2830,7 +2830,7 @@ void QPainter::setClipRegion(const QRegion &r, Qt::ClipOperation op)
return;
}
- if (!hasClipping() && (op == Qt::IntersectClip || op == Qt::UniteClip))
+ if ((!d->state->clipEnabled && op != Qt::NoClip) || (d->state->clipOperation == Qt::NoClip && op == Qt::UniteClip))
op = Qt::ReplaceClip;
if (d->extended) {
@@ -3235,7 +3235,7 @@ void QPainter::setClipPath(const QPainterPath &path, Qt::ClipOperation op)
return;
}
- if (!hasClipping() && (op == Qt::IntersectClip || op == Qt::UniteClip))
+ if ((!d->state->clipEnabled && op != Qt::NoClip) || (d->state->clipOperation == Qt::NoClip && op == Qt::UniteClip))
op = Qt::ReplaceClip;
if (d->extended) {