diff options
Diffstat (limited to 'src/widgets/kernel/qwidget.cpp')
-rw-r--r-- | src/widgets/kernel/qwidget.cpp | 47 |
1 files changed, 18 insertions, 29 deletions
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 28ad56c526..ad82e5eb2a 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -67,7 +67,6 @@ # include <private/qmainwindowlayout_p.h> #endif #include <qpa/qplatformwindow.h> -#include <qpa/qplatformbackingstore.h> #include "private/qwidgetwindow_p.h" #include "qpainter.h" #include "qtooltip.h" @@ -2103,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 @@ -3038,17 +3038,6 @@ void QWidget::overrideWindowState(Qt::WindowStates newstate) QApplication::sendEvent(this, &e); } -Qt::WindowState effectiveState(Qt::WindowStates state) -{ - if (state & Qt::WindowMinimized) - return Qt::WindowMinimized; - else if (state & Qt::WindowFullScreen) - return Qt::WindowFullScreen; - else if (state & Qt::WindowMaximized) - return Qt::WindowMaximized; - return Qt::WindowNoState; -} - /*! \fn void QWidget::setWindowState(Qt::WindowStates windowState) @@ -3090,19 +3079,17 @@ void QWidget::setWindowState(Qt::WindowStates newstate) data->window_state = newstate; data->in_set_window_state = 1; - Qt::WindowState newEffectiveState = effectiveState(newstate); - Qt::WindowState oldEffectiveState = effectiveState(oldstate); - if (isWindow() && newEffectiveState != oldEffectiveState) { + if (isWindow()) { // Ensure the initial size is valid, since we store it as normalGeometry below. if (!testAttribute(Qt::WA_Resized) && !isVisible()) adjustSize(); d->createTLExtra(); - if (oldEffectiveState == Qt::WindowNoState) + if (!(oldstate & (Qt::WindowMinimized | Qt::WindowMaximized | Qt::WindowFullScreen))) d->topData()->normalGeometry = geometry(); Q_ASSERT(windowHandle()); - windowHandle()->setWindowState(newEffectiveState); + windowHandle()->setWindowStates(newstate & ~Qt::WindowActive); } data->in_set_window_state = 0; @@ -5203,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. @@ -5216,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); @@ -5509,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) { @@ -5523,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; @@ -5575,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; @@ -5593,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 @@ -5661,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())) |