diff options
Diffstat (limited to 'src/bodymovin/bmproperty_p.h')
-rw-r--r-- | src/bodymovin/bmproperty_p.h | 140 |
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(); |