diff options
author | Andy Nichols <andy.nichols@qt.io> | 2016-04-20 14:02:55 +0200 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@theqtcompany.com> | 2016-04-20 13:22:40 +0000 |
commit | ed62c8f668bb0f7f17946764d510e286f111688a (patch) | |
tree | 0599b0589db6ec9d70b1dc23e5599eb0cec6c71d /src/quickwidgets | |
parent | 62198ab4485e15f350122770d5dfd8de7e59b8f9 (diff) |
QQuickWidget: Partial update support with software rendering
Change-Id: I886287812c1c3cd56739e24470492adc90cfafbb
Reviewed-by: Laszlo Agocs <laszlo.agocs@theqtcompany.com>
Diffstat (limited to 'src/quickwidgets')
-rw-r--r-- | src/quickwidgets/qquickwidget.cpp | 26 | ||||
-rw-r--r-- | src/quickwidgets/qquickwidget.h | 2 | ||||
-rw-r--r-- | src/quickwidgets/qquickwidget_p.h | 1 |
3 files changed, 22 insertions, 7 deletions
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<QQmlError> 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 |