diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-06-20 01:00:05 +0200 |
---|---|---|
committer | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-06-20 01:00:05 +0200 |
commit | acbc9a3984a5c729c6731f73431aae6d802aa78a (patch) | |
tree | 11580451e6478254d0c38a41f6670ea40c7a68a7 /src | |
parent | 8068e7b98cde09565efe27585b84e120f9c5ea99 (diff) | |
parent | 4050d0eddd33c9a77d4ffe285e137280ec5dd5fe (diff) |
Merge "Merge remote-tracking branch 'origin/5.13' into dev"
Diffstat (limited to 'src')
18 files changed, 72 insertions, 38 deletions
diff --git a/src/qml/animations/qabstractanimationjob.cpp b/src/qml/animations/qabstractanimationjob.cpp index ece2f0d692..7a784a2b35 100644 --- a/src/qml/animations/qabstractanimationjob.cpp +++ b/src/qml/animations/qabstractanimationjob.cpp @@ -263,7 +263,6 @@ QAbstractAnimationJob::QAbstractAnimationJob() , m_currentLoopStartTime(0) , m_nextSibling(nullptr) , m_previousSibling(nullptr) - , m_wasDeleted(nullptr) , m_hasRegisteredTimer(false) , m_isPause(false) , m_isGroup(false) @@ -277,9 +276,6 @@ QAbstractAnimationJob::QAbstractAnimationJob() QAbstractAnimationJob::~QAbstractAnimationJob() { - if (m_wasDeleted) - *m_wasDeleted = true; - //we can't call stop here. Otherwise we get pure virtual calls if (m_state != Stopped) { State oldState = m_state; diff --git a/src/qml/animations/qabstractanimationjob_p.h b/src/qml/animations/qabstractanimationjob_p.h index 0be6ca96ea..d046ce9def 100644 --- a/src/qml/animations/qabstractanimationjob_p.h +++ b/src/qml/animations/qabstractanimationjob_p.h @@ -52,6 +52,7 @@ // #include <private/qtqmlglobal_p.h> +#include <private/qanimationjobutil_p.h> #include <QtCore/QObject> #include <QtCore/private/qabstractanimation_p.h> #include <vector> @@ -130,6 +131,7 @@ public: bool isRenderThreadJob() const { return m_isRenderThreadJob; } bool isRenderThreadProxy() const { return m_isRenderThreadProxy; } + SelfDeletable m_selfDeletable; protected: virtual void updateCurrentTime(int) {} virtual void updateState(QAbstractAnimationJob::State newState, QAbstractAnimationJob::State oldState); @@ -174,7 +176,6 @@ protected: QAbstractAnimationJob *m_previousSibling; QQmlAnimationTimer *m_timer = nullptr; - bool *m_wasDeleted; bool m_hasRegisteredTimer:1; bool m_isPause:1; bool m_isGroup:1; diff --git a/src/qml/animations/qanimationjobutil_p.h b/src/qml/animations/qanimationjobutil_p.h index e3d6fe9178..83cf3b246f 100644 --- a/src/qml/animations/qanimationjobutil_p.h +++ b/src/qml/animations/qanimationjobutil_p.h @@ -51,20 +51,40 @@ // We mean it. // +#include <type_traits> + QT_REQUIRE_CONFIG(qml_animation); -#define RETURN_IF_DELETED(func) \ +// SelfDeletable is used for self-destruction detection along with +// ACTION_IF_DELETED and RETURN_IF_DELETED macros. While using, the objects +// under test should have a member m_selfDeletable of type SelfDeletable +struct SelfDeletable { + ~SelfDeletable() { + if (m_wasDeleted) + *m_wasDeleted = true; + } + bool *m_wasDeleted = nullptr; +}; + +// \param p pointer to object under test, which should have a member m_selfDeletable of type SelfDeletable +// \param func statements or functions that to be executed under test. +// \param action post process if p was deleted under test. +#define ACTION_IF_DELETED(p, func, action) \ { \ - bool *prevWasDeleted = m_wasDeleted; \ + static_assert(std::is_same<decltype((p)->m_selfDeletable), SelfDeletable>::value, "m_selfDeletable must be SelfDeletable");\ + bool *prevWasDeleted = (p)->m_selfDeletable.m_wasDeleted; \ bool wasDeleted = false; \ - m_wasDeleted = &wasDeleted; \ - func; \ + (p)->m_selfDeletable.m_wasDeleted = &wasDeleted; \ + {func;} \ if (wasDeleted) { \ if (prevWasDeleted) \ *prevWasDeleted = true; \ - return; \ + {action;} \ } \ - m_wasDeleted = prevWasDeleted; \ + (p)->m_selfDeletable.m_wasDeleted = prevWasDeleted; \ } +#define RETURN_IF_DELETED(func) \ +ACTION_IF_DELETED(this, func, return) + #endif // QANIMATIONJOBUTIL_P_H diff --git a/src/quick/items/qquickflickable.cpp b/src/quick/items/qquickflickable.cpp index d6dddc3f1c..7e1f54f07e 100644 --- a/src/quick/items/qquickflickable.cpp +++ b/src/quick/items/qquickflickable.cpp @@ -206,8 +206,8 @@ public: axisData->move.setValue(-flickable->contentX()); else axisData->move.setValue(-flickable->contentY()); - cancel(); active = false; + cancel(); } protected: diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp index 431cb80a75..c20f778a8f 100644 --- a/src/quick/items/qquickitemview.cpp +++ b/src/quick/items/qquickitemview.cpp @@ -2232,7 +2232,10 @@ bool QQuickItemViewPrivate::prepareNonVisibleItemTransition(FxViewItem *item, co if (item->scheduledTransitionType() == QQuickItemViewTransitioner::MoveTransition) repositionItemAt(item, item->index, 0); - if (item->prepareTransition(transitioner, viewBounds)) { + bool success = false; + ACTION_IF_DELETED(item, success = item->prepareTransition(transitioner, viewBounds), return success); + + if (success) { item->releaseAfterTransition = true; return true; } diff --git a/src/quick/items/qquickitemviewfxitem.cpp b/src/quick/items/qquickitemviewfxitem.cpp index 60e9d7b115..ead4a030ac 100644 --- a/src/quick/items/qquickitemviewfxitem.cpp +++ b/src/quick/items/qquickitemviewfxitem.cpp @@ -56,6 +56,8 @@ QQuickItemViewFxItem::QQuickItemViewFxItem(QQuickItem *item, bool ownItem, QQuic QQuickItemViewFxItem::~QQuickItemViewFxItem() { delete transitionableItem; + transitionableItem = nullptr; + if (ownItem && item) { trackGeometry(false); item->setParentItem(0); diff --git a/src/quick/items/qquickitemviewfxitem_p_p.h b/src/quick/items/qquickitemviewfxitem_p_p.h index 3bc5ba440c..3985630cda 100644 --- a/src/quick/items/qquickitemviewfxitem_p_p.h +++ b/src/quick/items/qquickitemviewfxitem_p_p.h @@ -54,6 +54,7 @@ #include <QtQuick/private/qtquickglobal_p.h> #include <QtQuick/private/qquickitem_p.h> #include <QtQuick/private/qquickitemviewtransition_p.h> +#include <private/qanimationjobutil_p.h> QT_REQUIRE_CONFIG(quick_itemview); @@ -94,6 +95,7 @@ public: virtual bool contains(qreal x, qreal y) const = 0; + SelfDeletable m_selfDeletable; QPointer<QQuickItem> item; QQuickItemChangeListener *changeListener; QQuickItemViewTransitionableItem *transitionableItem; diff --git a/src/quick/items/qquickitemviewtransition.cpp b/src/quick/items/qquickitemviewtransition.cpp index 0fde0beb75..109851608b 100644 --- a/src/quick/items/qquickitemviewtransition.cpp +++ b/src/quick/items/qquickitemviewtransition.cpp @@ -61,7 +61,6 @@ public: QPointF m_toPos; QQuickItemViewTransitioner::TransitionType m_type; bool m_isTarget; - bool *m_wasDeleted; protected: void finished() override; @@ -73,14 +72,11 @@ QQuickItemViewTransitionJob::QQuickItemViewTransitionJob() , m_item(nullptr) , m_type(QQuickItemViewTransitioner::NoTransition) , m_isTarget(false) - , m_wasDeleted(nullptr) { } QQuickItemViewTransitionJob::~QQuickItemViewTransitionJob() { - if (m_wasDeleted) - *m_wasDeleted = true; if (m_transitioner) m_transitioner->runningJobs.remove(this); } @@ -138,13 +134,7 @@ void QQuickItemViewTransitionJob::finished() QQuickTransitionManager::finished(); if (m_transitioner) { - bool deleted = false; - m_wasDeleted = &deleted; - m_transitioner->finishedTransition(this, m_item); - if (deleted) - return; - m_wasDeleted = nullptr; - + RETURN_IF_DELETED(m_transitioner->finishedTransition(this, m_item)); m_transitioner = nullptr; } @@ -482,7 +472,7 @@ bool QQuickItemViewTransitionableItem::prepareTransition(QQuickItemViewTransitio // if transition type is not valid, the previous transition still has to be // canceled so that the item can move immediately to the right position item->setPosition(nextTransitionTo); - stopTransition(); + ACTION_IF_DELETED(this, stopTransition(), return false); } prepared = true; @@ -501,12 +491,12 @@ void QQuickItemViewTransitionableItem::startTransition(QQuickItemViewTransitione if (!transition || transition->m_type != nextTransitionType || transition->m_isTarget != isTransitionTarget) { if (transition) - transition->cancel(); + RETURN_IF_DELETED(transition->cancel()); delete transition; transition = new QQuickItemViewTransitionJob; } - transition->startTransition(this, index, transitioner, nextTransitionType, nextTransitionTo, isTransitionTarget); + RETURN_IF_DELETED(transition->startTransition(this, index, transitioner, nextTransitionType, nextTransitionTo, isTransitionTarget)); clearCurrentScheduledTransition(); } @@ -558,7 +548,7 @@ void QQuickItemViewTransitionableItem::clearCurrentScheduledTransition() void QQuickItemViewTransitionableItem::stopTransition() { if (transition) - transition->cancel(); + RETURN_IF_DELETED(transition->cancel()); clearCurrentScheduledTransition(); resetNextTransitionPos(); } diff --git a/src/quick/items/qquickitemviewtransition_p.h b/src/quick/items/qquickitemviewtransition_p.h index 29a62f7f10..0c7a9cad75 100644 --- a/src/quick/items/qquickitemviewtransition_p.h +++ b/src/quick/items/qquickitemviewtransition_p.h @@ -60,6 +60,7 @@ QT_REQUIRE_CONFIG(quick_viewtransitions); #include <QtQml/qqml.h> #include <private/qqmlguard_p.h> #include <private/qquicktransition_p.h> +#include <private/qanimationjobutil_p.h> QT_BEGIN_NAMESPACE @@ -157,6 +158,7 @@ public: bool prepareTransition(QQuickItemViewTransitioner *transitioner, int index, const QRectF &viewBounds); void startTransition(QQuickItemViewTransitioner *transitioner, int index); + SelfDeletable m_selfDeletable; QPointF nextTransitionTo; QPointF lastMovedTo; QPointF nextTransitionFrom; diff --git a/src/quick/scenegraph/adaptations/software/qsgabstractsoftwarerenderer.cpp b/src/quick/scenegraph/adaptations/software/qsgabstractsoftwarerenderer.cpp index d715d900ba..ca620965a8 100644 --- a/src/quick/scenegraph/adaptations/software/qsgabstractsoftwarerenderer.cpp +++ b/src/quick/scenegraph/adaptations/software/qsgabstractsoftwarerenderer.cpp @@ -233,12 +233,13 @@ void QSGAbstractSoftwareRenderer::setBackgroundColor(const QColor &color) renderableNode(m_background)->markMaterialDirty(); } -void QSGAbstractSoftwareRenderer::setBackgroundRect(const QRect &rect) +void QSGAbstractSoftwareRenderer::setBackgroundRect(const QRect &rect, qreal devicePixelRatio) { - if (m_background->rect().toRect() == rect) + if (m_background->rect().toRect() == rect && m_devicePixelRatio == devicePixelRatio) return; m_background->setRect(rect); - renderableNode(m_background)->markGeometryDirty(); + m_devicePixelRatio = devicePixelRatio; + renderableNode(m_background)->markGeometryDirty(); // Invalidate the whole scene when the background is resized markDirty(); } diff --git a/src/quick/scenegraph/adaptations/software/qsgabstractsoftwarerenderer_p.h b/src/quick/scenegraph/adaptations/software/qsgabstractsoftwarerenderer_p.h index 6780aac17e..e1b477ab97 100644 --- a/src/quick/scenegraph/adaptations/software/qsgabstractsoftwarerenderer_p.h +++ b/src/quick/scenegraph/adaptations/software/qsgabstractsoftwarerenderer_p.h @@ -82,7 +82,7 @@ protected: QRegion optimizeRenderList(); void setBackgroundColor(const QColor &color); - void setBackgroundRect(const QRect &rect); + void setBackgroundRect(const QRect &rect, qreal devicePixelRatio); QColor backgroundColor(); QRect backgroundRect(); // only known after calling optimizeRenderList() @@ -103,6 +103,7 @@ private: QRegion m_dirtyRegion; QRegion m_obscuredRegion; + qreal m_devicePixelRatio = 1; bool m_isOpaque = false; QSGSoftwareRenderableNodeUpdater *m_nodeUpdater; diff --git a/src/quick/scenegraph/adaptations/software/qsgsoftwarepixmaprenderer.cpp b/src/quick/scenegraph/adaptations/software/qsgsoftwarepixmaprenderer.cpp index bb4afc8301..4a6d73ec59 100644 --- a/src/quick/scenegraph/adaptations/software/qsgsoftwarepixmaprenderer.cpp +++ b/src/quick/scenegraph/adaptations/software/qsgsoftwarepixmaprenderer.cpp @@ -79,7 +79,7 @@ void QSGSoftwarePixmapRenderer::render(QPaintDevice *target) QElapsedTimer renderTimer; // Setup background item - setBackgroundRect(m_projectionRect.normalized()); + setBackgroundRect(m_projectionRect.normalized(), qreal(1)); setBackgroundColor(clearColor()); renderTimer.start(); diff --git a/src/quick/scenegraph/adaptations/software/qsgsoftwarerenderer.cpp b/src/quick/scenegraph/adaptations/software/qsgsoftwarerenderer.cpp index e9ed52d428..df129cbfee 100644 --- a/src/quick/scenegraph/adaptations/software/qsgsoftwarerenderer.cpp +++ b/src/quick/scenegraph/adaptations/software/qsgsoftwarerenderer.cpp @@ -114,7 +114,8 @@ void QSGSoftwareRenderer::render() setBackgroundColor(clearColor()); setBackgroundRect(QRect(0, 0, m_paintDevice->width() / m_paintDevice->devicePixelRatioF(), - m_paintDevice->height() / m_paintDevice->devicePixelRatioF())); + m_paintDevice->height() / m_paintDevice->devicePixelRatioF()), + m_paintDevice->devicePixelRatioF()); // Build Renderlist // The renderlist is created by visiting each node in the tree and when a diff --git a/src/quick/scenegraph/util/qsgdefaultimagenode.cpp b/src/quick/scenegraph/util/qsgdefaultimagenode.cpp index 7186ee4265..48ec8f01d3 100644 --- a/src/quick/scenegraph/util/qsgdefaultimagenode.cpp +++ b/src/quick/scenegraph/util/qsgdefaultimagenode.cpp @@ -156,6 +156,10 @@ void QSGDefaultImageNode::setTexture(QSGTexture *texture) m_isAtlasTexture = texture->isAtlasTexture(); if (wasAtlas || m_isAtlasTexture) dirty |= DirtyGeometry; + // The geometry has also changed if the texture size changed. + if (m_textureSize != texture->textureSize()) + dirty |= DirtyGeometry; + m_textureSize = texture->textureSize(); markDirty(dirty); } diff --git a/src/quick/scenegraph/util/qsgdefaultimagenode_p.h b/src/quick/scenegraph/util/qsgdefaultimagenode_p.h index cb23e759d3..7b26daf541 100644 --- a/src/quick/scenegraph/util/qsgdefaultimagenode_p.h +++ b/src/quick/scenegraph/util/qsgdefaultimagenode_p.h @@ -95,6 +95,7 @@ private: QSGTextureMaterial m_material; QRectF m_rect; QRectF m_sourceRect; + QSize m_textureSize; TextureCoordinatesTransformMode m_texCoordMode; uint m_isAtlasTexture : 1; uint m_ownsTexture : 1; diff --git a/src/quick/util/qquicktransitionmanager.cpp b/src/quick/util/qquicktransitionmanager.cpp index e51de1a02a..0ee7e57997 100644 --- a/src/quick/util/qquicktransitionmanager.cpp +++ b/src/quick/util/qquicktransitionmanager.cpp @@ -47,6 +47,7 @@ #include <private/qqmlproperty_p.h> #include <QtCore/qdebug.h> +#include <private/qanimationjobutil_p.h> QT_BEGIN_NAMESPACE @@ -79,6 +80,7 @@ void QQuickTransitionManager::setState(QQuickState *s) QQuickTransitionManager::~QQuickTransitionManager() { delete d->transitionInstance; + d->transitionInstance = nullptr; delete d; d = nullptr; } @@ -129,7 +131,7 @@ void QQuickTransitionManager::transition(const QList<QQuickStateAction> &list, QQuickTransition *transition, QObject *defaultTarget) { - cancel(); + RETURN_IF_DELETED(cancel()); // The copy below is ON PURPOSE, because firing actions might involve scripts that modify the list. QQuickStateOperation::ActionList applyList = list; @@ -154,7 +156,6 @@ void QQuickTransitionManager::transition(const QList<QQuickStateAction> &list, // // This doesn't catch everything, and it might be a little fragile in // some cases - but whatcha going to do? - if (transition && !d->bindingsList.isEmpty()) { // Apply all the property and binding changes @@ -258,7 +259,7 @@ void QQuickTransitionManager::transition(const QList<QQuickStateAction> &list, void QQuickTransitionManager::cancel() { if (d->transitionInstance && d->transitionInstance->isRunning()) - d->transitionInstance->stop(); + RETURN_IF_DELETED(d->transitionInstance->stop()); for (const QQuickStateAction &action : qAsConst(d->bindingsList)) { if (action.toBinding && action.deletableToBinding) { diff --git a/src/quick/util/qquicktransitionmanager_p_p.h b/src/quick/util/qquicktransitionmanager_p_p.h index 89317e1e07..fc00ec8a52 100644 --- a/src/quick/util/qquicktransitionmanager_p_p.h +++ b/src/quick/util/qquicktransitionmanager_p_p.h @@ -52,6 +52,7 @@ // #include "qquickanimation_p.h" +#include <private/qanimationjobutil_p.h> QT_BEGIN_NAMESPACE @@ -70,6 +71,7 @@ public: void cancel(); + SelfDeletable m_selfDeletable; protected: virtual void finished(); diff --git a/src/quickshapes/qquickshape.cpp b/src/quickshapes/qquickshape.cpp index 262d0b3e9a..74cbf52a95 100644 --- a/src/quickshapes/qquickshape.cpp +++ b/src/quickshapes/qquickshape.cpp @@ -48,6 +48,13 @@ #include <QOpenGLFunctions> #include <QLoggingCategory> +#if defined(QT_STATIC) +static void initResources() +{ + Q_INIT_RESOURCE(qtquickshapes); +} +#endif + QT_BEGIN_NAMESPACE Q_LOGGING_CATEGORY(QQSHAPE_LOG_TIME_DIRTY_SYNC, "qt.shape.time.sync") @@ -662,7 +669,7 @@ struct QQuickShapeResourceInitializer QQuickShapeResourceInitializer() { #if defined(QT_STATIC) - Q_INIT_RESOURCE(qtquickshapes); + initResources(); #endif } }; |