diff options
author | Bjørn Erik Nilsen <bjorn.nilsen@nokia.com> | 2010-07-20 08:32:59 (GMT) |
---|---|---|
committer | Bjørn Erik Nilsen <bjorn.nilsen@nokia.com> | 2010-07-20 10:10:37 (GMT) |
commit | 4df9c96e2c213c39924e22e02621b0c61e83f8fe (patch) | |
tree | 3e95cfcf951ecbca57cfd01491586ab172e77cd1 /src/gui/graphicsview/qgraphicsscene.cpp | |
parent | 7bdbf59e43bd5db584923402b8a2ce2f50d1ca4b (diff) | |
download | Qt-4df9c96e2c213c39924e22e02621b0c61e83f8fe.zip Qt-4df9c96e2c213c39924e22e02621b0c61e83f8fe.tar.gz Qt-4df9c96e2c213c39924e22e02621b0c61e83f8fe.tar.bz2 |
QGraphicsItem: Animation leaves drawing artifacts when clipping is used.
This only happens when the ItemHasNoContents and ItemClipsChildrenToShape
flags are set. Problem is that items with no content are threated as 'dummy'
items, which means they are never drawn or 'processed' otherwise, so the
cached bounding rect is not reliable/usable. This means that in case of
changing the geometry of such items, its children always have to take
care of invalidating the occupied areas and the update can not be
clipped to the item's bounding rect.
Regression after commit: c1c7dbf2
Auto test included.
Task-number: QTBUG-11504
Reviewed-by: yoann
Diffstat (limited to 'src/gui/graphicsview/qgraphicsscene.cpp')
-rw-r--r-- | src/gui/graphicsview/qgraphicsscene.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/src/gui/graphicsview/qgraphicsscene.cpp b/src/gui/graphicsview/qgraphicsscene.cpp index 4bc7f4c..48a0093 100644 --- a/src/gui/graphicsview/qgraphicsscene.cpp +++ b/src/gui/graphicsview/qgraphicsscene.cpp @@ -5178,7 +5178,12 @@ void QGraphicsScenePrivate::processDirtyItemsRecursive(QGraphicsItem *item, bool // Process children. if (itemHasChildren && item->d_ptr->dirtyChildren) { const bool itemClipsChildrenToShape = item->d_ptr->flags & QGraphicsItem::ItemClipsChildrenToShape; - if (itemClipsChildrenToShape) { + // Items with no content are threated as 'dummy' items which means they are never drawn and + // 'processed', so the painted view bounding rect is never up-to-date. This means that whenever + // such an item changes geometry, its children have to take care of the update regardless + // of whether the item clips children to shape or not. + const bool bypassUpdateClip = !itemHasContents && wasDirtyParentViewBoundingRects; + if (itemClipsChildrenToShape && !bypassUpdateClip) { // Make sure child updates are clipped to the item's bounding rect. for (int i = 0; i < views.size(); ++i) views.at(i)->d_func()->setUpdateClip(item); |