From ed62c8f668bb0f7f17946764d510e286f111688a Mon Sep 17 00:00:00 2001 From: Andy Nichols Date: Wed, 20 Apr 2016 14:02:55 +0200 Subject: QQuickWidget: Partial update support with software rendering Change-Id: I886287812c1c3cd56739e24470492adc90cfafbb Reviewed-by: Laszlo Agocs --- src/quickwidgets/qquickwidget.cpp | 26 ++++++++++++++++++++------ src/quickwidgets/qquickwidget.h | 2 +- src/quickwidgets/qquickwidget_p.h | 1 + 3 files changed, 22 insertions(+), 7 deletions(-) (limited to 'src/quickwidgets') diff --git a/src/quickwidgets/qquickwidget.cpp b/src/quickwidgets/qquickwidget.cpp index bd4a34fdb8..b4efe2faea 100644 --- a/src/quickwidgets/qquickwidget.cpp +++ b/src/quickwidgets/qquickwidget.cpp @@ -227,7 +227,6 @@ void QQuickWidgetPrivate::itemGeometryChanged(QQuickItem *resizeItem, const QRec QQuickItemChangeListener::itemGeometryChanged(resizeItem, newGeometry, oldGeometry); } -// Is never called when using the software renderer void QQuickWidgetPrivate::render(bool needsSync) { if (!useSoftwareRenderer) { @@ -272,6 +271,8 @@ void QQuickWidgetPrivate::render(bool needsSync) if (softwareRenderer) { softwareRenderer->setCurrentPaintDevice(&softwareImage); renderControl->render(); + + updateRegion += softwareRenderer->flushRegion(); } } } @@ -301,7 +302,12 @@ void QQuickWidgetPrivate::renderSceneGraph() QWidgetPrivate::nearestGraphicsProxyWidget(q)->update(); else #endif - q->update(); // schedule composition + { + if (!useSoftwareRenderer) + q->update(); // schedule composition + else if (!updateRegion.isEmpty()) + q->update(updateRegion); + } } QImage QQuickWidgetPrivate::grabFramebuffer() @@ -418,7 +424,6 @@ QQuickWidget::QQuickWidget(QWidget *parent) { setMouseTracking(true); setFocusPolicy(Qt::StrongFocus); - setAttribute(Qt::WA_OpaquePaintEvent, true); d_func()->init(); } @@ -432,7 +437,6 @@ QQuickWidget::QQuickWidget(const QUrl &source, QWidget *parent) { setMouseTracking(true); setFocusPolicy(Qt::StrongFocus); - setAttribute(Qt::WA_OpaquePaintEvent, true); d_func()->init(); setSource(source); } @@ -451,7 +455,6 @@ QQuickWidget::QQuickWidget(QQmlEngine* engine, QWidget *parent) { setMouseTracking(true); setFocusPolicy(Qt::StrongFocus); - setAttribute(Qt::WA_OpaquePaintEvent, true); Q_ASSERT(engine); d_func()->init(engine); } @@ -1478,9 +1481,20 @@ QT_END_NAMESPACE void QQuickWidget::paintEvent(QPaintEvent *event) { + Q_UNUSED(event) Q_D(QQuickWidget); if (d->useSoftwareRenderer) { QPainter painter(this); - painter.drawImage(rect(), d->softwareImage); + if (d->updateRegion.isNull()) { + //Paint everything + painter.drawImage(rect(), d->softwareImage); + } else { + //Paint only the updated areas + for (auto targetRect : d->updateRegion.rects()) { + auto sourceRect = QRect(targetRect.topLeft() * devicePixelRatio(), targetRect.size() * devicePixelRatio()); + painter.drawImage(targetRect, d->softwareImage, sourceRect); + } + d->updateRegion = QRegion(); + } } } diff --git a/src/quickwidgets/qquickwidget.h b/src/quickwidgets/qquickwidget.h index 6e6c397c3e..56e6b01ac5 100644 --- a/src/quickwidgets/qquickwidget.h +++ b/src/quickwidgets/qquickwidget.h @@ -87,7 +87,7 @@ public: QList errors() const; - QSize sizeHint() const; + QSize sizeHint() const override; QSize initialSize() const; void setFormat(const QSurfaceFormat &format); diff --git a/src/quickwidgets/qquickwidget_p.h b/src/quickwidgets/qquickwidget_p.h index 12c6e739e1..5c35093c58 100644 --- a/src/quickwidgets/qquickwidget_p.h +++ b/src/quickwidgets/qquickwidget_p.h @@ -137,6 +137,7 @@ public: bool useSoftwareRenderer; QImage softwareImage; + QRegion updateRegion; }; QT_END_NAMESPACE -- cgit v1.2.3