diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2014-02-24 10:10:48 +0200 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2014-02-24 10:18:21 +0200 |
commit | 7139e43dec65fae9c5f2df6c762fdac50f62a768 (patch) | |
tree | 96f0ba78d4e6caa8475f2942b4f4fb164a0b790f /src/datavisualizationqml2/abstractdeclarative.cpp | |
parent | 1cd67696b863c2d31abeefe1aea1828680b1cf9b (diff) |
Improve antialiasing & msaaSamples handling in qml
+ Make sure we don't crash if old window gets destroyed
Change-Id: I037e0bb29284aad1dd37da6fcb6a0839bac962e0
Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'src/datavisualizationqml2/abstractdeclarative.cpp')
-rw-r--r-- | src/datavisualizationqml2/abstractdeclarative.cpp | 75 |
1 files changed, 38 insertions, 37 deletions
diff --git a/src/datavisualizationqml2/abstractdeclarative.cpp b/src/datavisualizationqml2/abstractdeclarative.cpp index 4bd75f57..5364325a 100644 --- a/src/datavisualizationqml2/abstractdeclarative.cpp +++ b/src/datavisualizationqml2/abstractdeclarative.cpp @@ -41,14 +41,11 @@ AbstractDeclarative::AbstractDeclarative(QQuickItem *parent) : #else m_samples(4), #endif + m_windowSamples(0), m_initialisedSize(0, 0) { connect(this, &QQuickItem::windowChanged, this, &AbstractDeclarative::handleWindowChanged); -#if !defined(QT_OPENGL_ES_2) - setAntialiasing(true); -#else - setAntialiasing(false); -#endif + setAntialiasing(m_samples > 0); setFlag(ItemHasContents, true); } @@ -82,14 +79,6 @@ void AbstractDeclarative::setRenderingMode(AbstractDeclarative::RenderingMode mo // Intentional flowthrough case RenderDirectToBackground_NoClear: m_initialisedSize = QSize(0, 0); -#if !defined(QT_OPENGL_ES_2) - if (win && win->format().samples() > 0) - setAntialiasing(true); - else - setAntialiasing(false); -#else - setAntialiasing(false); -#endif if (previousMode == RenderIndirect) { update(); setFlag(ItemHasContents, false); @@ -97,22 +86,13 @@ void AbstractDeclarative::setRenderingMode(AbstractDeclarative::RenderingMode mo QObject::connect(win, &QQuickWindow::beforeRendering, this, &AbstractDeclarative::render, Qt::DirectConnection); checkWindowList(win); - int samples = win->format().samples(); - if (samples != m_samples) - emit msaaSamplesChanged(samples); + setAntialiasing(m_windowSamples > 0); + if (m_windowSamples != m_samples) + emit msaaSamplesChanged(m_windowSamples); } } - break; case RenderIndirect: -#if !defined(QT_OPENGL_ES_2) - if (m_samples > 0) - setAntialiasing(true); - else - setAntialiasing(false); -#else - setAntialiasing(false); -#endif m_initialisedSize = QSize(0, 0); setFlag(ItemHasContents, true); update(); @@ -121,6 +101,9 @@ void AbstractDeclarative::setRenderingMode(AbstractDeclarative::RenderingMode mo &AbstractDeclarative::render); checkWindowList(win); } + setAntialiasing(m_samples > 0); + if (m_windowSamples != m_samples) + emit msaaSamplesChanged(m_samples); break; } @@ -269,10 +252,10 @@ void AbstractDeclarative::synchDataToRenderer() int AbstractDeclarative::msaaSamples() const { - int samples = m_samples; - if (window() && m_renderMode != RenderIndirect) - samples = window()->format().samples(); - return samples; + if (m_renderMode == RenderIndirect) + return m_samples; + else + return m_windowSamples; } void AbstractDeclarative::setMsaaSamples(int samples) @@ -286,10 +269,7 @@ void AbstractDeclarative::setMsaaSamples(int samples) #else if (m_samples != samples) { m_samples = samples; - if (m_samples > 0) - setAntialiasing(true); - else - setAntialiasing(false); + setAntialiasing(m_samples > 0); emit msaaSamplesChanged(samples); update(); } @@ -304,6 +284,13 @@ void AbstractDeclarative::handleWindowChanged(QQuickWindow *window) if (!window) return; + connect(window, &QObject::destroyed, this, &AbstractDeclarative::windowDestroyed); + + int oldWindowSamples = m_windowSamples; + m_windowSamples = window->format().samples(); + if (m_windowSamples < 0) + m_windowSamples = 0; + connect(window, &QQuickWindow::beforeSynchronizing, this, &AbstractDeclarative::synchDataToRenderer, Qt::DirectConnection); @@ -312,11 +299,11 @@ void AbstractDeclarative::handleWindowChanged(QQuickWindow *window) || m_renderMode == RenderDirectToBackground) { connect(window, &QQuickWindow::beforeRendering, this, &AbstractDeclarative::render, Qt::DirectConnection); - QQuickWindow *oldWindow = graphWindowList.value(this); - int samples = window->format().samples(); - if (oldWindow && samples != oldWindow->format().samples()) - emit msaaSamplesChanged(samples); + setAntialiasing(m_windowSamples > 0); + if (m_windowSamples != oldWindowSamples) + emit msaaSamplesChanged(m_windowSamples); } + connect(m_controller.data(), &Abstract3DController::needRender, window, &QQuickWindow::update); updateWindowParameters(); @@ -470,6 +457,8 @@ void AbstractDeclarative::checkWindowList(QQuickWindow *window) graphWindowList[this] = window; if (oldWindow != window && oldWindow) { + QObject::disconnect(oldWindow, &QObject::destroyed, this, + &AbstractDeclarative::windowDestroyed); QObject::disconnect(oldWindow, &QQuickWindow::beforeSynchronizing, this, &AbstractDeclarative::synchDataToRenderer); QObject::disconnect(oldWindow, &QQuickWindow::beforeRendering, this, @@ -511,4 +500,16 @@ void AbstractDeclarative::checkWindowList(QQuickWindow *window) } } +void AbstractDeclarative::windowDestroyed(QObject *obj) +{ + // Remove destroyed window from window lists + QQuickWindow *win = static_cast<QQuickWindow *>(obj); + QQuickWindow *oldWindow = graphWindowList.value(this); + + if (win == oldWindow) + graphWindowList.remove(this); + + windowClearList.remove(win); +} + QT_END_NAMESPACE_DATAVISUALIZATION |