summaryrefslogtreecommitdiffstats
path: root/src/declarative/canvas/qsimplecanvas_software.cpp
diff options
context:
space:
mode:
authorMichael Brasser <michael.brasser@nokia.com>2009-05-18 00:34:27 (GMT)
committerMichael Brasser <michael.brasser@nokia.com>2009-05-18 00:34:27 (GMT)
commit247952ec74cede6a69c718ef039e00b21a877e56 (patch)
treeacd1dfc788ee79aef932fafefb289965011df0d7 /src/declarative/canvas/qsimplecanvas_software.cpp
parent299ce6f43dc8c2f2953f6be551985edc485ea4f9 (diff)
downloadQt-247952ec74cede6a69c718ef039e00b21a877e56.zip
Qt-247952ec74cede6a69c718ef039e00b21a877e56.tar.gz
Qt-247952ec74cede6a69c718ef039e00b21a877e56.tar.bz2
Don't traverse clipped canvas trees.
Diffstat (limited to 'src/declarative/canvas/qsimplecanvas_software.cpp')
-rw-r--r--src/declarative/canvas/qsimplecanvas_software.cpp106
1 files changed, 57 insertions, 49 deletions
diff --git a/src/declarative/canvas/qsimplecanvas_software.cpp b/src/declarative/canvas/qsimplecanvas_software.cpp
index 194024d..f822677 100644
--- a/src/declarative/canvas/qsimplecanvas_software.cpp
+++ b/src/declarative/canvas/qsimplecanvas_software.cpp
@@ -51,52 +51,56 @@ QRect QSimpleCanvasItemPrivate::setupPainting(int version, const QRect &bounding
QRectF boundingRectActive = q->boundingRect();
QRect rv =
data()->transformActive.mapRect(boundingRectActive).toAlignedRect() & bounding;
+ data()->doNotPaint = rv.isEmpty();
+ data()->doNotPaintChildren = data()->doNotPaint && q->clip();
QRect myBounding = bounding;
if (q->clip())
myBounding &= rv;
- for (int ii = 0; ii < children.count(); ++ii) {
- QSimpleCanvasItem *child = children.at(ii);
-
- qreal visible = child->visible();
- child->d_func()->data()->activeOpacity = data()->activeOpacity;
- if (visible != 1)
- child->d_func()->data()->activeOpacity *= visible;
-
- if (child->d_func()->data()->activeOpacity != 0) {
- // Calculate child's transform
- qreal x = child->x();
- qreal y = child->y();
- qreal scale = child->scale();
- QSimpleCanvasItem::Flip flip = child->flip();
-
- QSimpleCanvas::Matrix &am = child->d_func()->data()->transformActive;
- am = data()->transformActive;
- if (x != 0 || y != 0)
- am.translate(x, y);
- if (scale != 1) {
- QPointF to = child->d_func()->transformOrigin();
- if (to.x() != 0. || to.y() != 0.)
- am.translate(to.x(), to.y());
- am.scale(scale, scale);
- if (to.x() != 0. || to.y() != 0.)
- am.translate(-to.x(), -to.y());
- }
-
- if (child->d_func()->data()->transformUser)
- am = *child->d_func()->data()->transformUser * am;
-
- if (flip) {
- QRectF br = child->boundingRect();
- am.translate(br.width() / 2., br.height() / 2);
- am.scale((flip & QSimpleCanvasItem::HorizontalFlip)?-1:1,
- (flip & QSimpleCanvasItem::VerticalFlip)?-1:1);
- am.translate(-br.width() / 2., -br.height() / 2);
- }
- child->d_func()->data()->transformValid = true;
- rv |= child->d_func()->setupPainting(version, myBounding);
- }
- }
+ if (!data()->doNotPaintChildren) {
+ for (int ii = 0; ii < children.count(); ++ii) {
+ QSimpleCanvasItem *child = children.at(ii);
+
+ qreal visible = child->visible();
+ child->d_func()->data()->activeOpacity = data()->activeOpacity;
+ if (visible != 1)
+ child->d_func()->data()->activeOpacity *= visible;
+
+ if (child->d_func()->data()->activeOpacity != 0) {
+ // Calculate child's transform
+ qreal x = child->x();
+ qreal y = child->y();
+ qreal scale = child->scale();
+ QSimpleCanvasItem::Flip flip = child->flip();
+
+ QSimpleCanvas::Matrix &am = child->d_func()->data()->transformActive;
+ am = data()->transformActive;
+ if (x != 0 || y != 0)
+ am.translate(x, y);
+ if (scale != 1) {
+ QPointF to = child->d_func()->transformOrigin();
+ if (to.x() != 0. || to.y() != 0.)
+ am.translate(to.x(), to.y());
+ am.scale(scale, scale);
+ if (to.x() != 0. || to.y() != 0.)
+ am.translate(-to.x(), -to.y());
+ }
+
+ if (child->d_func()->data()->transformUser)
+ am = *child->d_func()->data()->transformUser * am;
+
+ if (flip) {
+ QRectF br = child->boundingRect();
+ am.translate(br.width() / 2., br.height() / 2);
+ am.scale((flip & QSimpleCanvasItem::HorizontalFlip)?-1:1,
+ (flip & QSimpleCanvasItem::VerticalFlip)?-1:1);
+ am.translate(-br.width() / 2., -br.height() / 2);
+ }
+ child->d_func()->data()->transformValid = true;
+ rv |= child->d_func()->setupPainting(version, myBounding);
+ }
+ }
+ }
data()->lastPaintRect = rv;
return rv;
@@ -162,13 +166,17 @@ void QSimpleCanvasItemPrivate::paint(QPainter &p)
}
}
- p.setWorldTransform(data()->transformActive);
- q->paintContents(p);
-
- for (; upto < children.count(); ++upto) {
- QSimpleCanvasItem *c = children.at(upto);
- paintChild(p, c);
- }
+ if (!data()->doNotPaint) {
+ p.setWorldTransform(data()->transformActive);
+ q->paintContents(p);
+ }
+
+ if (!data()->doNotPaintChildren) {
+ for (; upto < children.count(); ++upto) {
+ QSimpleCanvasItem *c = children.at(upto);
+ paintChild(p, c);
+ }
+ }
if (clip)
p.restore();