aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/util/qquickanimatorjob_p.h
diff options
context:
space:
mode:
authorGunnar Sletta <gunnar.sletta@digia.com>2013-09-18 20:16:16 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-21 22:23:13 +0200
commita0f8be4021caa9bb5055923f0eea3bee0e345235 (patch)
treecf33dd92e8284f5692e65b1a574749d50da4a3f0 /src/quick/util/qquickanimatorjob_p.h
parent0fc040ef70513ccaeb9e96f7ca05a3df4d6c7879 (diff)
Animators - Render thread animation system
This introduces 6 new QML types for animating state in the scene graph when the UI thread is blocked. The QObject property being animated is updated after the animation completes. It works also with the "windows" and "basic" render loops, but offer litte benefit then compared to in the "threaded" case. Change-Id: Ic19e47c898c0b8bd53e457db922b3c9c457c8147 Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/quick/util/qquickanimatorjob_p.h')
-rw-r--r--src/quick/util/qquickanimatorjob_p.h284
1 files changed, 284 insertions, 0 deletions
diff --git a/src/quick/util/qquickanimatorjob_p.h b/src/quick/util/qquickanimatorjob_p.h
new file mode 100644
index 0000000000..c6814523c6
--- /dev/null
+++ b/src/quick/util/qquickanimatorjob_p.h
@@ -0,0 +1,284 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtQuick module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QQUICKANIMATORJOB_P_H
+#define QQUICKANIMATORJOB_P_H
+
+#include <private/qabstractanimationjob_p.h>
+#include <private/qquickanimator_p.h>
+#include <private/qtquickglobal_p.h>
+
+#include <QtQuick/qquickitem.h>
+
+#include <QtCore/qeasingcurve.h>
+
+QT_BEGIN_NAMESPACE
+
+class QQuickAnimator;
+class QQuickWindow;
+class QQuickItem;
+class QQuickAbstractAnimation;
+
+class QQuickAnimatorController;
+class QQuickAnimatorProxyJobPrivate;
+class QQuickShaderEffectNode;
+
+class QSGOpacityNode;
+
+class Q_QUICK_PRIVATE_EXPORT QQuickAnimatorProxyJob : public QObject, public QAbstractAnimationJob, public QAnimationJobChangeListener
+{
+ Q_OBJECT
+
+public:
+ QQuickAnimatorProxyJob(QAbstractAnimationJob *job, QObject *item);
+ ~QQuickAnimatorProxyJob();
+
+ int duration() const { return m_duration; }
+
+ virtual void animationFinished(QAbstractAnimationJob *);
+
+protected:
+ bool event(QEvent *);
+
+ void updateCurrentTime(int);
+ void updateState(QAbstractAnimationJob::State newState, QAbstractAnimationJob::State oldState);
+
+public Q_SLOTS:
+ void windowChanged(QQuickWindow *window);
+ void sceneGraphInitialized();
+
+private:
+ void deleteJob();
+ void syncBackCurrentValues();
+ void readyToAnimate();
+ void setWindow(QQuickWindow *window);
+ static QObject *findAnimationContext(QQuickAbstractAnimation *);
+ void startOnRenderThread();
+
+ QQuickAnimatorController *m_controller;
+ QQuickAbstractAnimation *m_animation;
+ QAbstractAnimationJob *m_job;
+ int m_duration;
+
+ enum InternalState {
+ State_Starting, // Used when it should be running, but no we're still missing the controller.
+ State_Running,
+ State_Paused,
+ State_Stopped
+ };
+
+ InternalState m_internalState;
+};
+
+class Q_QUICK_PRIVATE_EXPORT QQuickAnimatorJob : public QAbstractAnimationJob
+{
+public:
+ virtual void setTarget(QQuickItem *target);
+ QQuickItem *target() const { return m_target; }
+
+ void setFrom(qreal scale) { m_from = scale; }
+ qreal from() const { return m_from; }
+
+ void setTo(qreal to) { m_to = to; }
+ qreal to() const { return m_to; }
+
+ void setDuration(int duration) { m_duration = duration; }
+ int duration() const { return m_duration; }
+
+ QEasingCurve easingCurve() const { return m_easing; }
+ void setEasingCurve(const QEasingCurve &curve) { m_easing = curve; }
+
+ virtual void initialize(QQuickAnimatorController *controller);
+ virtual void writeBack() = 0;
+
+ bool isTransform() const { return m_isTransform; }
+ bool isUniform() const { return m_isUniform; }
+
+ qreal value() const;
+
+ QQuickAnimatorController *controller() const { return m_controller; }
+
+protected:
+ QQuickAnimatorJob();
+ void updateState(State newState, State oldState);
+
+ QPointer<QQuickItem> m_target;
+ QQuickAnimatorController *m_controller;
+
+ qreal m_from;
+ qreal m_to;
+ qreal m_value;
+
+ QEasingCurve m_easing;
+
+ int m_duration;
+
+ uint m_feedback : 1;
+ uint m_isTransform : 1;
+ uint m_isUniform : 1;
+};
+
+class QQuickTransformAnimatorJob : public QQuickAnimatorJob
+{
+public:
+
+ struct Helper
+ {
+ Helper()
+ : ref(1)
+ , item(0)
+ , node(0)
+ , ox(0)
+ , oy(0)
+ , dx(0)
+ , dy(0)
+ , scale(1)
+ , rotation(0)
+ , wasSynced(false)
+ , wasChanged(false)
+ {
+ }
+
+ void sync();
+ void apply();
+
+ int ref;
+ QQuickItem *item;
+ QSGTransformNode *node;
+
+ // Origin
+ float ox;
+ float oy;
+
+ float dx;
+ float dy;
+ float scale;
+ float rotation;
+
+ uint wasSynced : 1;
+ uint wasChanged : 1;
+ };
+
+ ~QQuickTransformAnimatorJob();
+ Helper *transformHelper() const { return m_helper; }
+
+protected:
+ QQuickTransformAnimatorJob();
+ void initialize(QQuickAnimatorController *controller);
+
+ Helper *m_helper;
+};
+
+class Q_QUICK_PRIVATE_EXPORT QQuickScaleAnimatorJob : public QQuickTransformAnimatorJob
+{
+public:
+ void updateCurrentTime(int time);
+ void writeBack();
+};
+
+class Q_QUICK_PRIVATE_EXPORT QQuickXAnimatorJob : public QQuickTransformAnimatorJob
+{
+public:
+ void updateCurrentTime(int time);
+ void writeBack();
+};
+
+class Q_QUICK_PRIVATE_EXPORT QQuickYAnimatorJob : public QQuickTransformAnimatorJob
+{
+public:
+ void updateCurrentTime(int time);
+ void writeBack();
+};
+
+class Q_QUICK_PRIVATE_EXPORT QQuickRotationAnimatorJob : public QQuickTransformAnimatorJob
+{
+public:
+ QQuickRotationAnimatorJob();
+
+ void updateCurrentTime(int time);
+ void writeBack();
+
+ void setDirection(QQuickRotationAnimator::RotationDirection direction) { m_direction = direction; }
+ QQuickRotationAnimator::RotationDirection direction() const { return m_direction; }
+
+private:
+ QQuickRotationAnimator::RotationDirection m_direction;
+};
+
+class Q_QUICK_PRIVATE_EXPORT QQuickOpacityAnimatorJob : public QQuickAnimatorJob
+{
+public:
+ QQuickOpacityAnimatorJob();
+
+ void initialize(QQuickAnimatorController *controller);
+ void updateCurrentTime(int time);
+ void writeBack();
+
+private:
+ QSGOpacityNode *m_opacityNode;
+};
+
+class Q_QUICK_PRIVATE_EXPORT QQuickUniformAnimatorJob : public QQuickAnimatorJob
+{
+public:
+ QQuickUniformAnimatorJob();
+
+ void setTarget(QQuickItem *target);
+
+ void setUniform(const QByteArray &uniform) { m_uniform = uniform; }
+ QByteArray uniform() const { return m_uniform; }
+
+ void afterNodeSync();
+
+ void updateCurrentTime(int time);
+ void writeBack();
+
+private:
+ QByteArray m_uniform;
+ QQuickShaderEffectNode *m_node;
+
+ int m_uniformIndex : 8;
+ int m_uniformType : 8;
+};
+
+QT_END_NAMESPACE
+
+#endif // QQUICKANIMATORJOB_P_H