diff options
author | Bjørn Erik Nilsen <bjorn.nilsen@nokia.com> | 2010-02-03 10:17:19 (GMT) |
---|---|---|
committer | Bjørn Erik Nilsen <bjorn.nilsen@nokia.com> | 2010-02-03 12:11:32 (GMT) |
commit | 80e114ad0b7974894858a17153d6f54546835066 (patch) | |
tree | 1d1a992c8462a8afc750d6339becbf30ebcca5b6 /src/gui/graphicsview | |
parent | cc585886ba9da17064a7fc858f5d717967da6e85 (diff) | |
download | Qt-80e114ad0b7974894858a17153d6f54546835066.zip Qt-80e114ad0b7974894858a17153d6f54546835066.tar.gz Qt-80e114ad0b7974894858a17153d6f54546835066.tar.bz2 |
QGraphicsScene: Use QPainter::setClipRect instead of setClipPath if possible.
Using QPainter::setClipPath results in complex (and slow) alphamasking
so this must be avoided if possible.
Task-number: QTBUG-7790
Reviewed-by: samuel
Diffstat (limited to 'src/gui/graphicsview')
-rw-r--r-- | src/gui/graphicsview/qgraphicsscene.cpp | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/gui/graphicsview/qgraphicsscene.cpp b/src/gui/graphicsview/qgraphicsscene.cpp index 842d368..4bfe9ad 100644 --- a/src/gui/graphicsview/qgraphicsscene.cpp +++ b/src/gui/graphicsview/qgraphicsscene.cpp @@ -251,6 +251,7 @@ #endif #include <private/qgraphicseffect_p.h> #include <private/qgesturemanager_p.h> +#include <private/qpathclipper_p.h> // #define GESTURE_DEBUG #ifndef GESTURE_DEBUG @@ -4765,7 +4766,12 @@ void QGraphicsScenePrivate::draw(QGraphicsItem *item, QPainter *painter, const Q painter->setWorldTransform(*transformPtr * *effectTransform); else painter->setWorldTransform(*transformPtr); - painter->setClipPath(item->shape(), Qt::IntersectClip); + QRectF clipRect; + const QPainterPath clipPath(item->shape()); + if (QPathClipper::pathToRect(clipPath, &clipRect)) + painter->setClipRect(clipRect, Qt::IntersectClip); + else + painter->setClipPath(clipPath, Qt::IntersectClip); } // Draw children behind @@ -4801,8 +4807,14 @@ void QGraphicsScenePrivate::draw(QGraphicsItem *item, QPainter *painter, const Q painter->setWorldTransform(*transformPtr); } - if (itemClipsToShape) - painter->setClipPath(item->shape(), Qt::IntersectClip); + if (itemClipsToShape) { + QRectF clipRect; + const QPainterPath clipPath(item->shape()); + if (QPathClipper::pathToRect(clipPath, &clipRect)) + painter->setClipRect(clipRect, Qt::IntersectClip); + else + painter->setClipPath(clipPath, Qt::IntersectClip); + } painter->setOpacity(opacity); if (!item->d_ptr->cacheMode && !item->d_ptr->isWidget) |