diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gui/painting/qpaintengine.cpp | 4 | ||||
-rw-r--r-- | src/gui/painting/qpaintengine_p.h | 25 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget.cpp | 27 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget_p.h | 2 |
4 files changed, 39 insertions, 19 deletions
diff --git a/src/gui/painting/qpaintengine.cpp b/src/gui/painting/qpaintengine.cpp index ddea168e72..5fc5d5364e 100644 --- a/src/gui/painting/qpaintengine.cpp +++ b/src/gui/painting/qpaintengine.cpp @@ -929,11 +929,11 @@ QPoint QPaintEngine::coordinateOffset() const void QPaintEngine::setSystemClip(const QRegion ®ion) { Q_D(QPaintEngine); - d->systemClip = region; + d->baseSystemClip = region; // Be backward compatible and only call d->systemStateChanged() // if we currently have a system transform/viewport set. + d->updateSystemClip(); if (d->hasSystemTransform || d->hasSystemViewport) { - d->transformSystemClip(); d->systemStateChanged(); } } diff --git a/src/gui/painting/qpaintengine_p.h b/src/gui/painting/qpaintengine_p.h index 9d511f9bad..8ac3fcff5c 100644 --- a/src/gui/painting/qpaintengine_p.h +++ b/src/gui/painting/qpaintengine_p.h @@ -71,6 +71,7 @@ public: QPaintDevice *pdev; QPaintEngine *q_ptr; + QRegion baseSystemClip; QRegion systemClip; QRect systemRect; QRegion systemViewport; @@ -79,8 +80,9 @@ public: uint hasSystemTransform : 1; uint hasSystemViewport : 1; - inline void transformSystemClip() + inline void updateSystemClip() { + systemClip = baseSystemClip; if (systemClip.isEmpty()) return; @@ -104,15 +106,30 @@ public: inline void setSystemTransform(const QTransform &xform) { systemTransform = xform; - if ((hasSystemTransform = !xform.isIdentity()) || hasSystemViewport) - transformSystemClip(); - systemStateChanged(); + hasSystemTransform = !xform.isIdentity(); + updateSystemClip(); + if (q_ptr->state) + systemStateChanged(); } inline void setSystemViewport(const QRegion ®ion) { systemViewport = region; hasSystemViewport = !systemViewport.isEmpty(); + updateSystemClip(); + if (q_ptr->state) + systemStateChanged(); + } + + inline void setSystemTransformAndViewport(const QTransform &xform, const QRegion ®ion) + { + systemTransform = xform; + hasSystemTransform = !xform.isIdentity(); + systemViewport = region; + hasSystemViewport = !systemViewport.isEmpty(); + updateSystemClip(); + if (q_ptr->state) + systemStateChanged(); } virtual void systemStateChanged() { } diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 1452bb36ae..7c62edeb2f 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -2102,14 +2102,15 @@ QRegion QWidgetPrivate::clipRegion() const return r; } -void QWidgetPrivate::setSystemClip(QPaintDevice *paintDevice, const QRegion ®ion) +void QWidgetPrivate::setSystemClip(QPaintEngine *paintEngine, qreal devicePixelRatio, const QRegion ®ion) { // Transform the system clip region from device-independent pixels to device pixels - QPaintEngine *paintEngine = paintDevice->paintEngine(); QTransform scaleTransform; - const qreal devicePixelRatio = paintDevice->devicePixelRatioF(); scaleTransform.scale(devicePixelRatio, devicePixelRatio); - paintEngine->d_func()->systemClip = scaleTransform.map(region); + + paintEngine->d_func()->baseSystemClip = region; + paintEngine->d_func()->setSystemTransform(scaleTransform); + } #ifndef QT_NO_GRAPHICSEFFECT @@ -5189,6 +5190,7 @@ void QWidget::render(QPainter *painter, const QPoint &targetOffset, // Save current system clip, viewport and transform, const QTransform oldTransform = enginePriv->systemTransform; const QRegion oldSystemClip = enginePriv->systemClip; + const QRegion oldBaseClip = enginePriv->baseSystemClip; const QRegion oldSystemViewport = enginePriv->systemViewport; // This ensures that all painting triggered by render() is clipped to the current engine clip. @@ -5202,9 +5204,8 @@ void QWidget::render(QPainter *painter, const QPoint &targetOffset, d->render(target, targetOffset, toBePainted, renderFlags); // Restore system clip, viewport and transform. - enginePriv->setSystemViewport(oldSystemViewport); - enginePriv->setSystemTransform(oldTransform); - enginePriv->systemClip = oldSystemClip; + enginePriv->baseSystemClip = oldBaseClip; + enginePriv->setSystemTransformAndViewport(oldTransform, oldSystemViewport); // Restore shared painter. d->setSharedPainter(oldPainter); @@ -5495,12 +5496,12 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP QWidgetPaintContext context(pdev, rgn, offset, flags, sharedPainter, backingStore); sourced->context = &context; if (!sharedPainter) { - setSystemClip(pdev, rgn.translated(offset)); + setSystemClip(pdev->paintEngine(), pdev->devicePixelRatioF(), rgn.translated(offset)); QPainter p(pdev); p.translate(offset); context.painter = &p; graphicsEffect->draw(&p); - setSystemClip(pdev, QRegion()); + setSystemClip(pdev->paintEngine(), 1, QRegion()); } else { context.painter = sharedPainter; if (sharedPainter->worldTransform() != sourced->lastEffectTransform) { @@ -5509,7 +5510,9 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP } sharedPainter->save(); sharedPainter->translate(offset); + setSystemClip(sharedPainter->paintEngine(), sharedPainter->device()->devicePixelRatioF(), rgn.translated(offset)); graphicsEffect->draw(sharedPainter); + setSystemClip(sharedPainter->paintEngine(), 1, QRegion()); sharedPainter->restore(); } sourced->context = 0; @@ -5561,7 +5564,7 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP #endif if (sharedPainter) - setSystemClip(pdev, toBePainted); + setSystemClip(pdev->paintEngine(), pdev->devicePixelRatioF(), toBePainted); else paintEngine->d_func()->systemRect = q->data->crect; @@ -5579,7 +5582,7 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP } if (!sharedPainter) - setSystemClip(pdev, toBePainted.translated(offset)); + setSystemClip(pdev->paintEngine(), pdev->devicePixelRatioF(), toBePainted.translated(offset)); if (!onScreen && !asRoot && !isOpaque && q->testAttribute(Qt::WA_TintedBackground)) { #ifndef QT_NO_OPENGL @@ -5647,7 +5650,7 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP else paintEngine->d_func()->currentClipDevice = 0; - setSystemClip(pdev, QRegion()); + setSystemClip(pdev->paintEngine(), 1, QRegion()); } q->setAttribute(Qt::WA_WState_InPaintEvent, false); if (Q_UNLIKELY(q->paintingActive())) diff --git a/src/widgets/kernel/qwidget_p.h b/src/widgets/kernel/qwidget_p.h index 858328e618..2c397aec88 100644 --- a/src/widgets/kernel/qwidget_p.h +++ b/src/widgets/kernel/qwidget_p.h @@ -409,7 +409,7 @@ public: QRect clipRect() const; QRegion clipRegion() const; - void setSystemClip(QPaintDevice *paintDevice, const QRegion ®ion); + void setSystemClip(QPaintEngine *paintEngine, qreal devicePixelRatio, const QRegion ®ion); void subtractOpaqueChildren(QRegion &rgn, const QRect &clipRect) const; void subtractOpaqueSiblings(QRegion &source, bool *hasDirtySiblingsAbove = 0, bool alsoNonOpaque = false) const; |