diff options
author | Samuel Rødal <sroedal@trolltech.com> | 2010-05-07 10:40:10 (GMT) |
---|---|---|
committer | Samuel Rødal <sroedal@trolltech.com> | 2010-05-07 10:50:46 (GMT) |
commit | 165fe7bdd7958cec3ec6c17f9ca15d92f30a4672 (patch) | |
tree | 35f93fbdc3036992fefdf8d28951432fb66f4306 /src/gui | |
parent | 2f9f59d7a33a7cfa5fe2127d726706f10842ca53 (diff) | |
download | Qt-165fe7bdd7958cec3ec6c17f9ca15d92f30a4672.zip Qt-165fe7bdd7958cec3ec6c17f9ca15d92f30a4672.tar.gz Qt-165fe7bdd7958cec3ec6c17f9ca15d92f30a4672.tar.bz2 |
Fixed scrolling bugs in widget graphics effect backend.
The cache wasn't invalidated for widgets with a graphics effect inside a
scrolling QScrollArea, so for now we disable caching for widget source
pixmaps. Also, we can't clip the source pixmap to device coordinates
since there's no knowledge of which areas of the source pixmap the
effect uses to compute the visible pixels. See change fd30cc9fabe6fc023
for the graphics item effect backend fix.
Reviewed-by: Bjørn Erik Nilsen
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/effects/qgraphicseffect.cpp | 2 | ||||
-rw-r--r-- | src/gui/kernel/qwidget.cpp | 35 |
2 files changed, 4 insertions, 33 deletions
diff --git a/src/gui/effects/qgraphicseffect.cpp b/src/gui/effects/qgraphicseffect.cpp index ce4ce6a..5e4e49e 100644 --- a/src/gui/effects/qgraphicseffect.cpp +++ b/src/gui/effects/qgraphicseffect.cpp @@ -326,7 +326,7 @@ QPixmap QGraphicsEffectSource::pixmap(Qt::CoordinateSystem system, QPoint *offse } QPixmap pm; - if (d->m_cachedSystem == system && d->m_cachedMode == mode) + if (item && d->m_cachedSystem == system && d->m_cachedMode == mode) QPixmapCache::find(d->m_cacheKey, &pm); if (pm.isNull()) { diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp index 5d08d4b..c058280 100644 --- a/src/gui/kernel/qwidget.cpp +++ b/src/gui/kernel/qwidget.cpp @@ -5583,47 +5583,18 @@ QPixmap QWidgetEffectSourcePrivate::pixmap(Qt::CoordinateSystem system, QPoint * pixmapOffset = painterTransform.map(pixmapOffset); } - QRect effectRect; - if (mode == QGraphicsEffect::PadToEffectiveBoundingRect) { + if (mode == QGraphicsEffect::PadToEffectiveBoundingRect) effectRect = m_widget->graphicsEffect()->boundingRectFor(sourceRect).toAlignedRect(); - - } else if (mode == QGraphicsEffect::PadToTransparentBorder) { + else if (mode == QGraphicsEffect::PadToTransparentBorder) effectRect = sourceRect.adjusted(-1, -1, 1, 1).toAlignedRect(); - - } else { + else effectRect = sourceRect.toAlignedRect(); - } - if (offset) *offset = effectRect.topLeft(); - if (deviceCoordinates) { - // Clip to device rect. - int left, top, right, bottom; - effectRect.getCoords(&left, &top, &right, &bottom); - if (left < 0) { - if (offset) - offset->rx() += -left; - effectRect.setX(0); - } - if (top < 0) { - if (offset) - offset->ry() += -top; - effectRect.setY(0); - } - // NB! We use +-1 for historical reasons (see QRect documentation). - QPaintDevice *device = context->painter->device(); - const int deviceWidth = device->width(); - const int deviceHeight = device->height(); - if (right + 1 > deviceWidth) - effectRect.setRight(deviceWidth - 1); - if (bottom + 1 > deviceHeight) - effectRect.setBottom(deviceHeight -1); - } - pixmapOffset -= effectRect.topLeft(); QPixmap pixmap(effectRect.size()); |