summaryrefslogtreecommitdiffstats
path: root/src/bodymovin/bmproperty_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/bodymovin/bmproperty_p.h')
-rw-r--r--src/bodymovin/bmproperty_p.h140
1 files changed, 130 insertions, 10 deletions
diff --git a/src/bodymovin/bmproperty_p.h b/src/bodymovin/bmproperty_p.h
index 106fe4f..d1f3127 100644
--- a/src/bodymovin/bmproperty_p.h
+++ b/src/bodymovin/bmproperty_p.h
@@ -75,7 +75,7 @@ class BODYMOVIN_EXPORT BMProperty
public:
virtual ~BMProperty() = default;
- virtual void construct(const QJsonObject &definition)
+ virtual void construct(const QJsonObject &definition, const QVersionNumber &version)
{
if (definition.value(QLatin1String("s")).toVariant().toInt())
qCWarning(lcLottieQtBodymovinParser)
@@ -86,11 +86,25 @@ public:
if (m_animated) {
QJsonArray keyframes = definition.value(QLatin1String("k")).toArray();
QJsonArray::const_iterator it = keyframes.constBegin();
- while (it != keyframes.constEnd()) {
- EasingSegment<T> easing = parseKeyframe((*it).toObject(),
- fromExpression);
- addEasing(easing);
- ++it;
+
+ bool schemaChanged = (version >= QVersionNumber(5, 5, 0));
+
+ if (!schemaChanged) {
+ while (it != keyframes.constEnd()) {
+ EasingSegment<T> easing = parseKeyframe((*it).toObject(), fromExpression);
+ addEasing(easing);
+ ++it;
+ }
+ } else {
+ while (it != (keyframes.constEnd() - 1)) {
+ EasingSegment<T> easing =
+ parseKeyframe((*it).toObject(), (*(it + 1)).toObject(), fromExpression);
+ addEasing(easing);
+ ++it;
+ }
+ int lastFrame = (*it).toObject().value(QLatin1String("t")).toVariant().toInt();
+ m_easingCurves.last().endFrame = lastFrame;
+ this->m_endFrame = lastFrame;
}
m_value = T();
} else
@@ -164,8 +178,7 @@ protected:
return m_currentEasing;
}
- virtual EasingSegment<T> parseKeyframe(const QJsonObject keyframe,
- bool fromExpression)
+ virtual EasingSegment<T> parseKeyframe(const QJsonObject keyframe, bool fromExpression)
{
Q_UNUSED(fromExpression);
@@ -214,6 +227,41 @@ protected:
return easing;
}
+ virtual EasingSegment<T> parseKeyframe(const QJsonObject keyframe,
+ const QJsonObject nextKeyframe, bool fromExpression)
+ {
+ Q_UNUSED(fromExpression);
+
+ EasingSegment<T> easing;
+
+ int startTime = keyframe.value(QLatin1String("t")).toVariant().toInt();
+
+ if (m_startFrame > startTime)
+ m_startFrame = startTime;
+
+ easing.startValue = getValue(keyframe.value(QLatin1String("s")).toArray());
+ easing.endValue = getValue(nextKeyframe.value(QLatin1String("s")).toArray());
+ easing.startFrame = startTime;
+
+ QJsonObject easingIn = keyframe.value(QLatin1String("i")).toObject();
+ QJsonObject easingOut = keyframe.value(QLatin1String("o")).toObject();
+
+ qreal eix = easingIn.value(QLatin1String("x")).toArray().at(0).toDouble();
+ qreal eiy = easingIn.value(QLatin1String("y")).toArray().at(0).toDouble();
+
+ qreal eox = easingOut.value(QLatin1String("x")).toArray().at(0).toDouble();
+ qreal eoy = easingOut.value(QLatin1String("y")).toArray().at(0).toDouble();
+
+ QPointF c1 = QPointF(eox, eoy);
+ QPointF c2 = QPointF(eix, eiy);
+
+ easing.easing.addCubicBezierSegment(c1, c2, QPointF(1.0, 1.0));
+
+ easing.complete = true;
+
+ return easing;
+ }
+
virtual T getValue(const QJsonValue &value)
{
if (value.isArray())
@@ -263,8 +311,7 @@ protected:
return T();
}
- EasingSegment<T> parseKeyframe(const QJsonObject keyframe,
- bool fromExpression) override
+ EasingSegment<T> parseKeyframe(const QJsonObject keyframe, bool fromExpression) override
{
QJsonArray startValues = keyframe.value(QLatin1String("s")).toArray();
QJsonArray endValues = keyframe.value(QLatin1String("e")).toArray();
@@ -326,6 +373,79 @@ protected:
qreal eix = eixArr.takeAt(0).toDouble();
qreal eiy = eiyArr.takeAt(0).toDouble();
+ qreal eox = eoxArr.takeAt(0).toDouble();
+ qreal eoy = eoyArr.takeAt(0).toDouble();
+
+ QPointF c1 = QPointF(eox, eoy);
+ QPointF c2 = QPointF(eix, eiy);
+
+ easingCurve.easing.addCubicBezierSegment(c1, c2, QPointF(1.0, 1.0));
+ }
+ } else {
+ qreal eix = easingIn.value(QLatin1String("x")).toDouble();
+ qreal eiy = easingIn.value(QLatin1String("y")).toDouble();
+
+ qreal eox = easingOut.value(QLatin1String("x")).toDouble();
+ qreal eoy = easingOut.value(QLatin1String("y")).toDouble();
+
+ QPointF c1 = QPointF(eox, eoy);
+ QPointF c2 = QPointF(eix, eiy);
+
+ easingCurve.easing.addCubicBezierSegment(c1, c2, QPointF(1.0, 1.0));
+ }
+
+ easingCurve.complete = true;
+ return easingCurve;
+ }
+
+ EasingSegment<T> parseKeyframe(const QJsonObject keyframe, const QJsonObject nextKeyframe,
+ bool fromExpression) override
+ {
+ QJsonArray startValues = keyframe.value(QLatin1String("s")).toArray();
+ QJsonArray endValues = nextKeyframe.value(QLatin1String("s")).toArray();
+ int startTime = keyframe.value(QLatin1String("t")).toVariant().toInt();
+
+ EasingSegment<T> easingCurve;
+ easingCurve.startFrame = startTime;
+
+ if (this->m_startFrame > startTime)
+ this->m_startFrame = startTime;
+
+ qreal xs, ys, xe, ye;
+ // Keyframes originating from an expression use only scalar values.
+ // They must be expanded for both x and y coordinates
+ if (fromExpression) {
+ xs = startValues.at(0).toDouble();
+ ys = startValues.at(0).toDouble();
+ xe = endValues.at(0).toDouble();
+ ye = endValues.at(0).toDouble();
+ } else {
+ xs = startValues.at(0).toDouble();
+ ys = startValues.at(1).toDouble();
+ xe = endValues.at(0).toDouble();
+ ye = endValues.at(1).toDouble();
+ }
+ T s(xs, ys);
+ T e(xe, ye);
+
+ QJsonObject easingIn = keyframe.value(QLatin1String("i")).toObject();
+ QJsonObject easingOut = keyframe.value(QLatin1String("o")).toObject();
+
+ easingCurve.startFrame = startTime;
+ easingCurve.startValue = s;
+ easingCurve.endValue = e;
+
+ if (easingIn.value(QLatin1String("x")).isArray()) {
+ QJsonArray eixArr = easingIn.value(QLatin1String("x")).toArray();
+ QJsonArray eiyArr = easingIn.value(QLatin1String("y")).toArray();
+
+ QJsonArray eoxArr = easingOut.value(QLatin1String("x")).toArray();
+ QJsonArray eoyArr = easingOut.value(QLatin1String("y")).toArray();
+
+ while (!eixArr.isEmpty() && !eiyArr.isEmpty()) {
+ qreal eix = eixArr.takeAt(0).toDouble();
+ qreal eiy = eiyArr.takeAt(0).toDouble();
+
qreal eox =eoxArr.takeAt(0).toDouble();
qreal eoy = eoyArr.takeAt(0).toDouble();