summaryrefslogtreecommitdiffstats
path: root/src/bodymovin/bmspatialproperty_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/bodymovin/bmspatialproperty_p.h')
-rw-r--r--src/bodymovin/bmspatialproperty_p.h61
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) {