diff options
Diffstat (limited to 'src/bodymovin/bmspatialproperty_p.h')
-rw-r--r-- | src/bodymovin/bmspatialproperty_p.h | 61 |
1 files changed, 57 insertions, 4 deletions
diff --git a/src/bodymovin/bmspatialproperty_p.h b/src/bodymovin/bmspatialproperty_p.h index 09e27a8..22e428c 100644 --- a/src/bodymovin/bmspatialproperty_p.h +++ b/src/bodymovin/bmspatialproperty_p.h @@ -51,15 +51,68 @@ QT_BEGIN_NAMESPACE class BMSpatialProperty : public BMProperty2D<QPointF> { public: - virtual void construct(const QJsonObject &definition) override + virtual void construct(const QJsonObject &definition, const QVersionNumber &version) override { qCDebug(lcLottieQtBodymovinParser) << "BMSpatialProperty::construct()"; - BMProperty2D<QPointF>::construct(definition); + BMProperty2D<QPointF>::construct(definition, version); } - virtual EasingSegment<QPointF> parseKeyframe(const QJsonObject keyframe, bool fromExpression) override + virtual EasingSegment<QPointF> parseKeyframe(const QJsonObject keyframe, + bool fromExpression) override { - EasingSegment<QPointF> easing = BMProperty2D<QPointF>::parseKeyframe(keyframe, fromExpression); + EasingSegment<QPointF> easing = + BMProperty2D<QPointF>::parseKeyframe(keyframe, fromExpression); + + // No need to parse further incomplete keyframes (i.e. last keyframes) + if (!easing.complete) { + return easing; + } + + qreal tix = 0, tiy = 0, tox = 0, toy = 0; + if (fromExpression) { + // If spatial property definition originates from + // an expression (specifically Slider), it contains scalar + // property. It must be expanded to both x and y coordinates + QJsonArray iArr = keyframe.value(QLatin1String("i")).toArray(); + QJsonArray oArr = keyframe.value(QLatin1String("o")).toArray(); + + if (iArr.count() && oArr.count()) { + tix = iArr.at(0).toDouble(); + tiy = tix; + tox = oArr.at(0).toDouble(); + toy = tox; + } + } else { + QJsonArray tiArr = keyframe.value(QLatin1String("ti")).toArray(); + QJsonArray toArr = keyframe.value(QLatin1String("to")).toArray(); + + if (tiArr.count() && toArr.count()) { + tix = tiArr.at(0).toDouble(); + tiy = tiArr.at(1).toDouble(); + tox = toArr.at(0).toDouble(); + toy = toArr.at(1).toDouble(); + } + } + QPointF s(easing.startValue); + QPointF e(easing.endValue); + QPointF c1(tox, toy); + QPointF c2(tix, tiy); + + c1 += s; + c2 += e; + + m_bezierPath.moveTo(s); + m_bezierPath.cubicTo(c1, c2, e); + + return easing; + } + + virtual EasingSegment<QPointF> parseKeyframe(const QJsonObject keyframe, + const QJsonObject nextKeyframe, + bool fromExpression) override + { + EasingSegment<QPointF> easing = + BMProperty2D<QPointF>::parseKeyframe(keyframe, nextKeyframe, fromExpression); // No need to parse further incomplete keyframes (i.e. last keyframes) if (!easing.complete) { |