summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKwanghyo Park <kwanghyo.park@qt.io>2022-06-21 15:50:56 +0300
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-12-14 08:21:03 +0000
commit146defd6a02f886144347794f458800607aab9a4 (patch)
treea75d7fe0c87aa658c11fe5cf1a7dbf0636df3ef1
parentc2edf185ba4ff36bef6727d6f53d91f72d64e00a (diff)
Fix an error on parsing property animation keyframes
There was update on bodymovin schema on animating property. Applying those updates. Preserve old implementation for backward compatibility. Task-number: QTBUG-102550 Change-Id: I1ca18ca727e267b6e5e442e1fae4b5aa72572ece Reviewed-by: Kwanghyo Park <kwanghyo.park@qt.io> Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io> Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io> Reviewed-by: Janne Koskinen <janne.p.koskinen@qt.io> (cherry picked from commit f467e29f74fd121b62ad66cb70da9a4b7f6e3248) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/bodymovin/bmbase_p.h3
-rw-r--r--src/bodymovin/bmbasictransform.cpp21
-rw-r--r--src/bodymovin/bmbasictransform_p.h5
-rw-r--r--src/bodymovin/bmellipse.cpp11
-rw-r--r--src/bodymovin/bmellipse_p.h5
-rw-r--r--src/bodymovin/bmfill.cpp6
-rw-r--r--src/bodymovin/bmfill_p.h2
-rw-r--r--src/bodymovin/bmfilleffect.cpp10
-rw-r--r--src/bodymovin/bmfilleffect_p.h2
-rw-r--r--src/bodymovin/bmfreeformshape.cpp14
-rw-r--r--src/bodymovin/bmfreeformshape_p.h5
-rw-r--r--src/bodymovin/bmgfill.cpp12
-rw-r--r--src/bodymovin/bmgfill_p.h2
-rw-r--r--src/bodymovin/bmgroup.cpp8
-rw-r--r--src/bodymovin/bmgroup_p.h4
-rw-r--r--src/bodymovin/bmimage.cpp10
-rw-r--r--src/bodymovin/bmimage_p.h4
-rw-r--r--src/bodymovin/bmimagelayer.cpp9
-rw-r--r--src/bodymovin/bmimagelayer_p.h2
-rw-r--r--src/bodymovin/bmlayer.cpp8
-rw-r--r--src/bodymovin/bmlayer_p.h4
-rw-r--r--src/bodymovin/bmproperty_p.h140
-rw-r--r--src/bodymovin/bmrect.cpp8
-rw-r--r--src/bodymovin/bmrect_p.h4
-rw-r--r--src/bodymovin/bmrepeater.cpp12
-rw-r--r--src/bodymovin/bmrepeater_p.h5
-rw-r--r--src/bodymovin/bmrepeatertransform.cpp13
-rw-r--r--src/bodymovin/bmrepeatertransform_p.h5
-rw-r--r--src/bodymovin/bmround.cpp10
-rw-r--r--src/bodymovin/bmround_p.h4
-rw-r--r--src/bodymovin/bmshape.cpp24
-rw-r--r--src/bodymovin/bmshape_p.h3
-rw-r--r--src/bodymovin/bmshapelayer.cpp7
-rw-r--r--src/bodymovin/bmshapelayer_p.h2
-rw-r--r--src/bodymovin/bmshapetransform.cpp13
-rw-r--r--src/bodymovin/bmshapetransform_p.h4
-rw-r--r--src/bodymovin/bmspatialproperty_p.h61
-rw-r--r--src/bodymovin/bmstroke.cpp8
-rw-r--r--src/bodymovin/bmstroke_p.h3
-rw-r--r--src/bodymovin/bmtrimpath.cpp12
-rw-r--r--src/bodymovin/bmtrimpath_p.h5
-rw-r--r--src/imports/lottieanimation.cpp11
-rw-r--r--src/imports/lottieanimation.h3
-rw-r--r--src/imports/rasterrenderer/batchrenderer.cpp7
-rw-r--r--src/imports/rasterrenderer/batchrenderer.h4
-rw-r--r--tests/auto/bodymovin/shape/ellipse/tst_bmellipse.cpp8
-rw-r--r--tests/auto/bodymovin/shape/fill/tst_bmfill.cpp8
-rw-r--r--tests/auto/bodymovin/shape/path/tst_bmpath.cpp8
-rw-r--r--tests/auto/bodymovin/shape/rect/tst_bmrect.cpp8
-rw-r--r--tests/auto/bodymovin/shape/repeater/tst_bmrepeater.cpp8
-rw-r--r--tests/auto/bodymovin/shape/repeatertransform/tst_bmrepeatertransform.cpp8
-rw-r--r--tests/auto/bodymovin/shape/shapelayer/tst_bmshapelayer.cpp10
-rw-r--r--tests/auto/bodymovin/shape/shapetransform/tst_bmshapetransform.cpp8
-rw-r--r--tests/auto/bodymovin/shape/stroke/tst_bmstroke.cpp8
-rw-r--r--tests/auto/bodymovin/shape/transform/tst_bmbasictransform.cpp8
-rw-r--r--tests/auto/bodymovin/shape/trimpath/tst_bmtrimpath.cpp8
56 files changed, 438 insertions, 167 deletions
diff --git a/src/bodymovin/bmbase_p.h b/src/bodymovin/bmbase_p.h
index 7fa5821..8f20ec9 100644
--- a/src/bodymovin/bmbase_p.h
+++ b/src/bodymovin/bmbase_p.h
@@ -43,6 +43,7 @@
#include <QJsonObject>
#include <QList>
+#include <QVersionNumber>
#include <QtBodymovin/bmglobal.h>
#include <QtBodymovin/private/bmconstants_p.h>
@@ -50,7 +51,6 @@
#include <QtBodymovin/private/lottierenderer_p.h>
QT_BEGIN_NAMESPACE
-
class BODYMOVIN_EXPORT BMBase
{
public:
@@ -95,6 +95,7 @@ protected:
QJsonObject m_definition;
int m_type;
bool m_hidden = false;
+ QVersionNumber m_version;
QString m_name;
QString m_matchName;
bool m_autoOrient = false;
diff --git a/src/bodymovin/bmbasictransform.cpp b/src/bodymovin/bmbasictransform.cpp
index 6e9e9c7..b58faee 100644
--- a/src/bodymovin/bmbasictransform.cpp
+++ b/src/bodymovin/bmbasictransform.cpp
@@ -49,10 +49,11 @@ BMBasicTransform::BMBasicTransform(const BMBasicTransform &other)
m_opacity = other.m_opacity;
}
-BMBasicTransform::BMBasicTransform(const QJsonObject &definition, BMBase *parent)
+BMBasicTransform::BMBasicTransform(const QJsonObject &definition, const QVersionNumber &version,
+ BMBase *parent)
{
setParent(parent);
- construct(definition);
+ construct(definition, version);
}
BMBase *BMBasicTransform::clone() const
@@ -60,7 +61,7 @@ BMBase *BMBasicTransform::clone() const
return new BMBasicTransform(*this);
}
-void BMBasicTransform::construct(const QJsonObject &definition)
+void BMBasicTransform::construct(const QJsonObject &definition, const QVersionNumber &version)
{
BMBase::parse(definition);
@@ -69,38 +70,38 @@ void BMBasicTransform::construct(const QJsonObject &definition)
QJsonObject anchors = definition.value(QLatin1String("a")).toObject();
anchors = resolveExpression(anchors);
- m_anchorPoint.construct(anchors);
+ m_anchorPoint.construct(anchors, version);
if (definition.value(QLatin1String("p")).toObject().contains(QLatin1String("s"))) {
QJsonObject posX = definition.value(QLatin1String("p")).toObject().value(QLatin1String("x")).toObject();
posX = resolveExpression(posX);
- m_xPos.construct(posX);
+ m_xPos.construct(posX, version);
QJsonObject posY = definition.value(QLatin1String("p")).toObject().value(QLatin1String("y")).toObject();
posY = resolveExpression(posY);
- m_yPos.construct(posY);
+ m_yPos.construct(posY, version);
m_splitPosition = true;
} else {
QJsonObject position = definition.value(QLatin1String("p")).toObject();
position = resolveExpression(position);
- m_position.construct(position);
+ m_position.construct(position, version);
}
QJsonObject scale = definition.value(QLatin1String("s")).toObject();
scale = resolveExpression(scale);
- m_scale.construct(scale);
+ m_scale.construct(scale, version);
QJsonObject rotation = definition.value(QLatin1String("r")).toObject();
rotation = resolveExpression(rotation);
- m_rotation.construct(rotation);
+ m_rotation.construct(rotation, version);
// If this is the base class for BMRepeaterTransform,
// opacity is not present
if (definition.contains(QLatin1String("o"))) {
QJsonObject opacity = definition.value(QLatin1String("o")).toObject();
opacity = resolveExpression(opacity);
- m_opacity.construct(opacity);
+ m_opacity.construct(opacity, version);
}
}
diff --git a/src/bodymovin/bmbasictransform_p.h b/src/bodymovin/bmbasictransform_p.h
index f6683b6..25aba42 100644
--- a/src/bodymovin/bmbasictransform_p.h
+++ b/src/bodymovin/bmbasictransform_p.h
@@ -56,11 +56,12 @@ class BODYMOVIN_EXPORT BMBasicTransform : public BMShape
public:
BMBasicTransform() = default;
explicit BMBasicTransform(const BMBasicTransform &other);
- BMBasicTransform(const QJsonObject &definition, BMBase *parent = nullptr);
+ BMBasicTransform(const QJsonObject &definition, const QVersionNumber &version,
+ BMBase *parent = nullptr);
BMBase *clone() const override;
- void construct(const QJsonObject &definition);
+ void construct(const QJsonObject &definition, const QVersionNumber &version);
void updateProperties(int frame) override;
void render(LottieRenderer &renderer) const override;
diff --git a/src/bodymovin/bmellipse.cpp b/src/bodymovin/bmellipse.cpp
index ddf162a..a52d791 100644
--- a/src/bodymovin/bmellipse.cpp
+++ b/src/bodymovin/bmellipse.cpp
@@ -43,10 +43,10 @@ BMEllipse::BMEllipse(const BMEllipse &other)
m_size = other.m_size;
}
-BMEllipse::BMEllipse(const QJsonObject &definition, BMBase *parent)
+BMEllipse::BMEllipse(const QJsonObject &definition, const QVersionNumber &version, BMBase *parent)
{
setParent(parent);
- construct(definition);
+ construct(definition, version);
}
BMBase *BMEllipse::clone() const
@@ -54,8 +54,7 @@ BMBase *BMEllipse::clone() const
return new BMEllipse(*this);
}
-
-void BMEllipse::construct(const QJsonObject &definition)
+void BMEllipse::construct(const QJsonObject &definition, const QVersionNumber &version)
{
BMBase::parse(definition);
if (m_hidden)
@@ -65,11 +64,11 @@ void BMEllipse::construct(const QJsonObject &definition)
QJsonObject position = definition.value(QLatin1String("p")).toObject();
position = resolveExpression(position);
- m_position.construct(position);
+ m_position.construct(position, version);
QJsonObject size = definition.value(QLatin1String("s")).toObject();
size = resolveExpression(size);
- m_size.construct(size);
+ m_size.construct(size, version);
m_direction = definition.value(QLatin1String("d")).toInt();
}
diff --git a/src/bodymovin/bmellipse_p.h b/src/bodymovin/bmellipse_p.h
index 737a468..f8ed823 100644
--- a/src/bodymovin/bmellipse_p.h
+++ b/src/bodymovin/bmellipse_p.h
@@ -62,11 +62,12 @@ class BODYMOVIN_EXPORT BMEllipse : public BMShape
public:
BMEllipse() = default;
explicit BMEllipse(const BMEllipse &other);
- BMEllipse(const QJsonObject &definition, BMBase *parent = nullptr);
+ BMEllipse(const QJsonObject &definition, const QVersionNumber &version,
+ BMBase *parent = nullptr);
BMBase *clone() const override;
- void construct(const QJsonObject &definition);
+ void construct(const QJsonObject &definition, const QVersionNumber &version);
void updateProperties(int frame) override;
void render(LottieRenderer &renderer) const override;
diff --git a/src/bodymovin/bmfill.cpp b/src/bodymovin/bmfill.cpp
index 8ab4308..1824ba6 100644
--- a/src/bodymovin/bmfill.cpp
+++ b/src/bodymovin/bmfill.cpp
@@ -38,7 +38,7 @@ BMFill::BMFill(const BMFill &other)
m_opacity = other.m_opacity;
}
-BMFill::BMFill(const QJsonObject &definition, BMBase *parent)
+BMFill::BMFill(const QJsonObject &definition, const QVersionNumber &version, BMBase *parent)
{
setParent(parent);
BMBase::parse(definition);
@@ -48,11 +48,11 @@ BMFill::BMFill(const QJsonObject &definition, BMBase *parent)
qCDebug(lcLottieQtBodymovinParser) << "BMFill::construct():" << m_name;
QJsonObject color = definition.value(QLatin1String("c")).toObject();
- m_color.construct(color);
+ m_color.construct(color, version);
QJsonObject opacity = definition.value(QLatin1String("o")).toObject();
opacity = resolveExpression(opacity);
- m_opacity.construct(opacity);
+ m_opacity.construct(opacity, version);
}
BMBase *BMFill::clone() const
diff --git a/src/bodymovin/bmfill_p.h b/src/bodymovin/bmfill_p.h
index b36149f..4953d61 100644
--- a/src/bodymovin/bmfill_p.h
+++ b/src/bodymovin/bmfill_p.h
@@ -54,7 +54,7 @@ class BODYMOVIN_EXPORT BMFill : public BMShape
public:
BMFill() = default;
explicit BMFill(const BMFill &other);
- BMFill(const QJsonObject &definition, BMBase *parent = nullptr);
+ BMFill(const QJsonObject &definition, const QVersionNumber &version, BMBase *parent = nullptr);
BMBase *clone() const override;
diff --git a/src/bodymovin/bmfilleffect.cpp b/src/bodymovin/bmfilleffect.cpp
index f5ed532..366f8a0 100644
--- a/src/bodymovin/bmfilleffect.cpp
+++ b/src/bodymovin/bmfilleffect.cpp
@@ -48,7 +48,7 @@ BMBase *BMFillEffect::clone() const
return new BMFillEffect(*this);
}
-void BMFillEffect::construct(const QJsonObject &definition)
+void BMFillEffect::construct(const QJsonObject &definition, const QVersionNumber &version)
{
m_type = BM_EFFECT_FILL;
@@ -59,8 +59,8 @@ void BMFillEffect::construct(const QJsonObject &definition)
// TODO: Check are property positions really fixed in the effect?
- m_color.construct(properties.at(2).toObject().value(QLatin1String("v")).toObject());
- m_opacity.construct(properties.at(6).toObject().value(QLatin1String("v")).toObject());
+ m_color.construct(properties.at(2).toObject().value(QLatin1String("v")).toObject(), version);
+ m_opacity.construct(properties.at(6).toObject().value(QLatin1String("v")).toObject(), version);
if (!qFuzzyCompare(properties.at(0).toObject().value(QLatin1String("v")).toObject().value(QLatin1String("k")).toDouble(), 0.0))
qCWarning(lcLottieQtBodymovinParser)<< "BMFillEffect: Property 'Fill mask' not supported";
@@ -75,8 +75,8 @@ void BMFillEffect::construct(const QJsonObject &definition)
qCWarning(lcLottieQtBodymovinParser) << "BMFillEffect: Property 'Horizontal feather' not supported";
if (!qFuzzyCompare(properties.at(5).toObject().value(QLatin1String("v")).toObject().value(QLatin1String("k")).toDouble(), 0.0))
- qCWarning(lcLottieQtBodymovinParser) << "BMFillEffect: Property 'Vertical feather' not supported";
-
+ qCWarning(lcLottieQtBodymovinParser)
+ << "BMFillEffect: Property 'Vertical feather' not supported";
}
void BMFillEffect::updateProperties(int frame)
diff --git a/src/bodymovin/bmfilleffect_p.h b/src/bodymovin/bmfilleffect_p.h
index 0fcc00d..28b177e 100644
--- a/src/bodymovin/bmfilleffect_p.h
+++ b/src/bodymovin/bmfilleffect_p.h
@@ -59,7 +59,7 @@ public:
BMBase *clone() const override;
- void construct(const QJsonObject &definition);
+ void construct(const QJsonObject &definition, const QVersionNumber &version);
void updateProperties(int frame) override;
void render(LottieRenderer &renderer) const override;
diff --git a/src/bodymovin/bmfreeformshape.cpp b/src/bodymovin/bmfreeformshape.cpp
index a714314..b4ef5f8 100644
--- a/src/bodymovin/bmfreeformshape.cpp
+++ b/src/bodymovin/bmfreeformshape.cpp
@@ -45,10 +45,11 @@ BMFreeFormShape::BMFreeFormShape(const BMFreeFormShape &other)
m_vertexMap = other.m_vertexMap;
}
-BMFreeFormShape::BMFreeFormShape(const QJsonObject &definition, BMBase *parent)
+BMFreeFormShape::BMFreeFormShape(const QJsonObject &definition, const QVersionNumber &version,
+ BMBase *parent)
{
setParent(parent);
- construct(definition);
+ construct(definition, version);
}
BMBase *BMFreeFormShape::clone() const
@@ -56,9 +57,10 @@ BMBase *BMFreeFormShape::clone() const
return new BMFreeFormShape(*this);
}
-void BMFreeFormShape::construct(const QJsonObject &definition)
+void BMFreeFormShape::construct(const QJsonObject &definition, const QVersionNumber &version)
{
BMBase::parse(definition);
+ m_version = version;
if (m_hidden)
return;
@@ -315,9 +317,9 @@ void BMFreeFormShape::finalizeVertices()
coObj.insert(QLatin1String("k"), m_vertexInfos.value(i)->coKeyframes);
VertexInfo vertexInfo;
- vertexInfo.pos.construct(posObj);
- vertexInfo.ci.construct(ciObj);
- vertexInfo.co.construct(coObj);
+ vertexInfo.pos.construct(posObj, m_version);
+ vertexInfo.ci.construct(ciObj, m_version);
+ vertexInfo.co.construct(coObj, m_version);
m_vertexList.push_back(vertexInfo);
}
qDeleteAll(m_vertexInfos);
diff --git a/src/bodymovin/bmfreeformshape_p.h b/src/bodymovin/bmfreeformshape_p.h
index 11293c7..8c02d30 100644
--- a/src/bodymovin/bmfreeformshape_p.h
+++ b/src/bodymovin/bmfreeformshape_p.h
@@ -58,11 +58,12 @@ class BODYMOVIN_EXPORT BMFreeFormShape : public BMShape
public:
BMFreeFormShape();
explicit BMFreeFormShape(const BMFreeFormShape &other);
- BMFreeFormShape(const QJsonObject &definition, BMBase *parent = nullptr);
+ BMFreeFormShape(const QJsonObject &definition, const QVersionNumber &version,
+ BMBase *parent = nullptr);
BMBase *clone() const override;
- void construct(const QJsonObject &definition);
+ void construct(const QJsonObject &definition, const QVersionNumber &version);
void updateProperties(int frame) override;
void render(LottieRenderer &renderer) const override;
diff --git a/src/bodymovin/bmgfill.cpp b/src/bodymovin/bmgfill.cpp
index 8a8cbbf..fc1c317 100644
--- a/src/bodymovin/bmgfill.cpp
+++ b/src/bodymovin/bmgfill.cpp
@@ -68,7 +68,7 @@ BMBase *BMGFill::clone() const
return new BMGFill(*this);
}
-BMGFill::BMGFill(const QJsonObject &definition, BMBase *parent)
+BMGFill::BMGFill(const QJsonObject &definition, const QVersionNumber &version, BMBase *parent)
{
setParent(parent);
@@ -108,22 +108,22 @@ BMGFill::BMGFill(const QJsonObject &definition, BMBase *parent)
QJsonObject opacity = definition.value(QLatin1String("o")).toObject();
opacity = resolveExpression(opacity);
- m_opacity.construct(opacity);
+ m_opacity.construct(opacity, version);
QJsonObject startPoint = definition.value(QLatin1String("s")).toObject();
startPoint = resolveExpression(startPoint);
- m_startPoint.construct(startPoint);
+ m_startPoint.construct(startPoint, version);
QJsonObject endPoint = definition.value(QLatin1String("e")).toObject();
endPoint = resolveExpression(endPoint);
- m_endPoint.construct(endPoint);
+ m_endPoint.construct(endPoint, version);
QJsonObject highlight = definition.value(QLatin1String("h")).toObject();
- m_highlightLength.construct(highlight);
+ m_highlightLength.construct(highlight, version);
QJsonObject angle = definition.value(QLatin1String("a")).toObject();
angle = resolveExpression(angle);
- m_highlightAngle.construct(angle);
+ m_highlightAngle.construct(angle, version);
m_highlightAngle.setValue(0.0);
}
diff --git a/src/bodymovin/bmgfill_p.h b/src/bodymovin/bmgfill_p.h
index 345fac5..b58b6a0 100644
--- a/src/bodymovin/bmgfill_p.h
+++ b/src/bodymovin/bmgfill_p.h
@@ -56,7 +56,7 @@ class BODYMOVIN_EXPORT BMGFill : public BMShape
public:
BMGFill() = default;
explicit BMGFill(const BMGFill &other);
- BMGFill(const QJsonObject &definition, BMBase *parent = nullptr);
+ BMGFill(const QJsonObject &definition, const QVersionNumber &version, BMBase *parent = nullptr);
~BMGFill() override;
BMBase *clone() const override;
diff --git a/src/bodymovin/bmgroup.cpp b/src/bodymovin/bmgroup.cpp
index cdbf9ce..166ad88 100644
--- a/src/bodymovin/bmgroup.cpp
+++ b/src/bodymovin/bmgroup.cpp
@@ -39,10 +39,10 @@
QT_BEGIN_NAMESPACE
-BMGroup::BMGroup(const QJsonObject &definition, BMBase *parent)
+BMGroup::BMGroup(const QJsonObject &definition, const QVersionNumber &version, BMBase *parent)
{
setParent(parent);
- construct(definition);
+ construct(definition, version);
}
BMBase *BMGroup::clone() const
@@ -50,7 +50,7 @@ BMBase *BMGroup::clone() const
return new BMGroup(*this);
}
-void BMGroup::construct(const QJsonObject &definition)
+void BMGroup::construct(const QJsonObject &definition, const QVersionNumber &version)
{
BMBase::parse(definition);
if (m_hidden)
@@ -63,7 +63,7 @@ void BMGroup::construct(const QJsonObject &definition)
QJsonArray::const_iterator itemIt = groupItems.constEnd();
while (itemIt != groupItems.constBegin()) {
itemIt--;
- BMShape *shape = BMShape::construct((*itemIt).toObject(), this);
+ BMShape *shape = BMShape::construct((*itemIt).toObject(), version, this);
if (shape) {
// Transform affects how group contents are drawn.
// It must be traversed first when drawing
diff --git a/src/bodymovin/bmgroup_p.h b/src/bodymovin/bmgroup_p.h
index d6ea794..fc73cf7 100644
--- a/src/bodymovin/bmgroup_p.h
+++ b/src/bodymovin/bmgroup_p.h
@@ -58,11 +58,11 @@ class BODYMOVIN_EXPORT BMGroup : public BMShape
{
public:
BMGroup() = default;
- BMGroup(const QJsonObject &definition, BMBase *parent = nullptr);
+ BMGroup(const QJsonObject &definition, const QVersionNumber &version, BMBase *parent = nullptr);
BMBase *clone() const override;
- void construct(const QJsonObject& definition);
+ void construct(const QJsonObject &definition, const QVersionNumber &version);
void updateProperties(int frame) override;
void render(LottieRenderer &renderer) const override;
diff --git a/src/bodymovin/bmimage.cpp b/src/bodymovin/bmimage.cpp
index 808186b..3c60587 100644
--- a/src/bodymovin/bmimage.cpp
+++ b/src/bodymovin/bmimage.cpp
@@ -45,10 +45,10 @@ BMImage::BMImage(const BMImage &other)
m_image = other.m_image;
}
-BMImage::BMImage(const QJsonObject &definition, BMBase *parent)
+BMImage::BMImage(const QJsonObject &definition, const QVersionNumber &version, BMBase *parent)
{
setParent(parent);
- construct(definition);
+ construct(definition, version);
}
BMBase *BMImage::clone() const
@@ -56,7 +56,7 @@ BMBase *BMImage::clone() const
return new BMImage(*this);
}
-void BMImage::construct(const QJsonObject &definition)
+void BMImage::construct(const QJsonObject &definition, const QVersionNumber &version)
{
BMBase::parse(definition);
if (m_hidden)
@@ -86,11 +86,11 @@ void BMImage::construct(const QJsonObject &definition)
QJsonObject position = definition.value(QLatin1String("p")).toObject();
position = resolveExpression(position);
- m_position.construct(position);
+ m_position.construct(position, version);
QJsonObject radius = definition.value(QLatin1String("r")).toObject();
radius = resolveExpression(radius);
- m_radius.construct(radius);
+ m_radius.construct(radius, version);
}
void BMImage::updateProperties(int frame)
diff --git a/src/bodymovin/bmimage_p.h b/src/bodymovin/bmimage_p.h
index 4db857c..967cbb5 100644
--- a/src/bodymovin/bmimage_p.h
+++ b/src/bodymovin/bmimage_p.h
@@ -56,11 +56,11 @@ class BODYMOVIN_EXPORT BMImage : public BMBase
public:
BMImage() = default;
explicit BMImage(const BMImage &other);
- BMImage(const QJsonObject &definition, BMBase *parent = nullptr);
+ BMImage(const QJsonObject &definition, const QVersionNumber &version, BMBase *parent = nullptr);
BMBase *clone() const override;
- void construct(const QJsonObject &definition);
+ void construct(const QJsonObject &definition, const QVersionNumber &version);
void updateProperties(int frame) override;
void render(LottieRenderer &renderer) const override;
diff --git a/src/bodymovin/bmimagelayer.cpp b/src/bodymovin/bmimagelayer.cpp
index a5be95b..d73121d 100644
--- a/src/bodymovin/bmimagelayer.cpp
+++ b/src/bodymovin/bmimagelayer.cpp
@@ -50,13 +50,14 @@ BMImageLayer::BMImageLayer(const BMImageLayer &other)
m_appliedTrim = other.m_appliedTrim;
}
-BMImageLayer::BMImageLayer(const QJsonObject &definition)
+BMImageLayer::BMImageLayer(const QJsonObject &definition, const QVersionNumber &version)
{
m_type = BM_LAYER_IMAGE_IX;
+ m_version = version;
BMLayer::parse(definition);
- BMImage *image = new BMImage(definition, this);
+ BMImage *image = new BMImage(definition, version, this);
appendChild(image);
if (m_hidden)
@@ -73,13 +74,13 @@ BMImageLayer::BMImageLayer(const QJsonObject &definition)
}
QJsonObject trans = definition.value(QLatin1String("ks")).toObject();
- m_layerTransform = new BMBasicTransform(trans, this);
+ m_layerTransform = new BMBasicTransform(trans, version, this);
QJsonArray items = definition.value(QLatin1String("shapes")).toArray();
QJsonArray::const_iterator itemIt = items.constEnd();
while (itemIt != items.constBegin()) {
itemIt--;
- BMShape *shape = BMShape::construct((*itemIt).toObject(), this);
+ BMShape *shape = BMShape::construct((*itemIt).toObject(), version, this);
if (shape)
appendChild(shape);
}
diff --git a/src/bodymovin/bmimagelayer_p.h b/src/bodymovin/bmimagelayer_p.h
index b384247..666e9ac 100644
--- a/src/bodymovin/bmimagelayer_p.h
+++ b/src/bodymovin/bmimagelayer_p.h
@@ -57,7 +57,7 @@ class BODYMOVIN_EXPORT BMImageLayer : public BMLayer
public:
BMImageLayer() = default;
explicit BMImageLayer(const BMImageLayer &other);
- BMImageLayer(const QJsonObject &definition);
+ BMImageLayer(const QJsonObject &definition, const QVersionNumber &version);
~BMImageLayer() override;
BMBase *clone() const override;
diff --git a/src/bodymovin/bmlayer.cpp b/src/bodymovin/bmlayer.cpp
index f54c293..4fa8d39 100644
--- a/src/bodymovin/bmlayer.cpp
+++ b/src/bodymovin/bmlayer.cpp
@@ -73,7 +73,7 @@ BMBase *BMLayer::clone() const
return new BMLayer(*this);
}
-BMLayer *BMLayer::construct(QJsonObject definition)
+BMLayer *BMLayer::construct(QJsonObject definition, const QVersionNumber &version)
{
qCDebug(lcLottieQtBodymovinParser) << "BMLayer::construct()";
@@ -82,11 +82,11 @@ BMLayer *BMLayer::construct(QJsonObject definition)
switch (type) {
case 2:
qCDebug(lcLottieQtBodymovinParser) << "Parse image layer";
- layer = new BMImageLayer(definition);
+ layer = new BMImageLayer(definition, version);
break;
case 4:
qCDebug(lcLottieQtBodymovinParser) << "Parse shape layer";
- layer = new BMShapeLayer(definition);
+ layer = new BMShapeLayer(definition, version);
break;
default:
qCWarning(lcLottieQtBodymovinParser) << "Unsupported layer type:" << type;
@@ -270,7 +270,7 @@ void BMLayer::parseEffects(const QJsonArray &definition, BMBase *effectRoot)
case 21:
{
BMFillEffect *fill = new BMFillEffect;
- fill->construct(effect);
+ fill->construct(effect, m_version);
effectRoot->appendChild(fill);
break;
}
diff --git a/src/bodymovin/bmlayer_p.h b/src/bodymovin/bmlayer_p.h
index aefc234..17d9c5b 100644
--- a/src/bodymovin/bmlayer_p.h
+++ b/src/bodymovin/bmlayer_p.h
@@ -58,11 +58,11 @@ public:
BMBase *clone() const override;
- static BMLayer *construct(QJsonObject definition);
+ static BMLayer *construct(QJsonObject definition, const QVersionNumber &version);
bool active(int frame) const override;
- void parse(const QJsonObject &definition) override;
+ void parse(const QJsonObject &definition) override;
void updateProperties(int frame) override;
void render(LottieRenderer &renderer) const override;
diff --git a/src/bodymovin/bmproperty_p.h b/src/bodymovin/bmproperty_p.h
index d00782a..2691d2a 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();
diff --git a/src/bodymovin/bmrect.cpp b/src/bodymovin/bmrect.cpp
index f91b570..b6cc928 100644
--- a/src/bodymovin/bmrect.cpp
+++ b/src/bodymovin/bmrect.cpp
@@ -47,7 +47,7 @@ BMRect::BMRect(const BMRect &other)
m_roundness = other.m_roundness;
}
-BMRect::BMRect(const QJsonObject &definition, BMBase *parent)
+BMRect::BMRect(const QJsonObject &definition, const QVersionNumber &version, BMBase *parent)
{
setParent(parent);
BMBase::parse(definition);
@@ -58,15 +58,15 @@ BMRect::BMRect(const QJsonObject &definition, BMBase *parent)
QJsonObject position = definition.value(QLatin1String("p")).toObject();
position = resolveExpression(position);
- m_position.construct(position);
+ m_position.construct(position, version);
QJsonObject size = definition.value(QLatin1String("s")).toObject();
size = resolveExpression(size);
- m_size.construct(size);
+ m_size.construct(size, version);
QJsonObject roundness = definition.value(QLatin1String("r")).toObject();
roundness = resolveExpression(roundness);
- m_roundness.construct(roundness);
+ m_roundness.construct(roundness, version);
m_direction = definition.value(QLatin1String("d")).toInt();
}
diff --git a/src/bodymovin/bmrect_p.h b/src/bodymovin/bmrect_p.h
index e1c7d3e..a1c3ebb 100644
--- a/src/bodymovin/bmrect_p.h
+++ b/src/bodymovin/bmrect_p.h
@@ -59,11 +59,11 @@ class BODYMOVIN_EXPORT BMRect : public BMShape
public:
BMRect() = default;
explicit BMRect(const BMRect &other);
- BMRect(const QJsonObject &definition, BMBase *parent = nullptr);
+ BMRect(const QJsonObject &definition, const QVersionNumber &version, BMBase *parent = nullptr);
BMBase *clone() const override;
- void construct(const QJsonObject &definition);
+ void construct(const QJsonObject &definition, const QVersionNumber &version);
bool setProperty(BMLiteral::PropertyType propertyType, QVariant value) override;
diff --git a/src/bodymovin/bmrepeater.cpp b/src/bodymovin/bmrepeater.cpp
index 8390782..626423f 100644
--- a/src/bodymovin/bmrepeater.cpp
+++ b/src/bodymovin/bmrepeater.cpp
@@ -29,11 +29,11 @@
#include "bmrepeater_p.h"
-BMRepeater::BMRepeater(const QJsonObject &definition, BMBase *parent)
+BMRepeater::BMRepeater(const QJsonObject &definition, const QVersionNumber &version, BMBase *parent)
{
setParent(parent);
m_transform.setParent(this);
- construct(definition);
+ construct(definition, version);
}
BMBase *BMRepeater::clone() const
@@ -41,7 +41,7 @@ BMBase *BMRepeater::clone() const
return new BMRepeater(*this);
}
-void BMRepeater::construct(const QJsonObject &definition)
+void BMRepeater::construct(const QJsonObject &definition, const QVersionNumber &version)
{
qCDebug(lcLottieQtBodymovinParser) << "BMRepeater::construct():" << m_name;
@@ -51,13 +51,13 @@ void BMRepeater::construct(const QJsonObject &definition)
QJsonObject copies = definition.value(QLatin1String("c")).toObject();
copies = resolveExpression(copies);
- m_copies.construct(copies);
+ m_copies.construct(copies, version);
QJsonObject offset = definition.value(QLatin1String("o")).toObject();
offset = resolveExpression(offset);
- m_offset.construct(offset);
+ m_offset.construct(offset, version);
- m_transform.construct(definition.value(QLatin1String("tr")).toObject());
+ m_transform.construct(definition.value(QLatin1String("tr")).toObject(), version);
}
void BMRepeater::updateProperties(int frame)
diff --git a/src/bodymovin/bmrepeater_p.h b/src/bodymovin/bmrepeater_p.h
index 37efb00..7ca7876 100644
--- a/src/bodymovin/bmrepeater_p.h
+++ b/src/bodymovin/bmrepeater_p.h
@@ -55,11 +55,12 @@ class BODYMOVIN_EXPORT BMRepeater : public BMShape
public:
BMRepeater() = default;
explicit BMRepeater(const BMRepeater &other) = default;
- BMRepeater(const QJsonObject &definition, BMBase *parent = nullptr);
+ BMRepeater(const QJsonObject &definition, const QVersionNumber &version,
+ BMBase *parent = nullptr);
BMBase *clone() const override;
- void construct(const QJsonObject& definition);
+ void construct(const QJsonObject &definition, const QVersionNumber &version);
void updateProperties(int frame) override;
void render(LottieRenderer &renderer) const override;
diff --git a/src/bodymovin/bmrepeatertransform.cpp b/src/bodymovin/bmrepeatertransform.cpp
index a001aec..06779fb 100644
--- a/src/bodymovin/bmrepeatertransform.cpp
+++ b/src/bodymovin/bmrepeatertransform.cpp
@@ -39,10 +39,11 @@ BMRepeaterTransform::BMRepeaterTransform(const BMRepeaterTransform &other)
m_opacities = other.m_opacities;
}
-BMRepeaterTransform::BMRepeaterTransform(const QJsonObject &definition, BMBase *parent)
+BMRepeaterTransform::BMRepeaterTransform(const QJsonObject &definition,
+ const QVersionNumber &version, BMBase *parent)
{
setParent(parent);
- construct(definition);
+ construct(definition, version);
}
BMBase *BMRepeaterTransform::clone() const
@@ -50,21 +51,21 @@ BMBase *BMRepeaterTransform::clone() const
return new BMRepeaterTransform(*this);
}
-void BMRepeaterTransform::construct(const QJsonObject &definition)
+void BMRepeaterTransform::construct(const QJsonObject &definition, const QVersionNumber &version)
{
qCDebug(lcLottieQtBodymovinParser) << "BMRepeaterTransform::construct():" << name();
- BMBasicTransform::construct(definition);
+ BMBasicTransform::construct(definition, version);
if (m_hidden)
return;
QJsonObject startOpacity = definition.value(QLatin1String("so")).toObject();
startOpacity = resolveExpression(startOpacity);
- m_startOpacity.construct(startOpacity);
+ m_startOpacity.construct(startOpacity, version);
QJsonObject endOpacity = definition.value(QLatin1String("eo")).toObject();
endOpacity = resolveExpression(endOpacity);
- m_endOpacity.construct(endOpacity);
+ m_endOpacity.construct(endOpacity, version);
}
void BMRepeaterTransform::updateProperties(int frame)
diff --git a/src/bodymovin/bmrepeatertransform_p.h b/src/bodymovin/bmrepeatertransform_p.h
index 35a9fc0..a461886 100644
--- a/src/bodymovin/bmrepeatertransform_p.h
+++ b/src/bodymovin/bmrepeatertransform_p.h
@@ -52,11 +52,12 @@ class BODYMOVIN_EXPORT BMRepeaterTransform : public BMBasicTransform
public:
BMRepeaterTransform() = default;
explicit BMRepeaterTransform(const BMRepeaterTransform &other);
- BMRepeaterTransform(const QJsonObject &definition, BMBase *parent);
+ BMRepeaterTransform(const QJsonObject &definition, const QVersionNumber &version,
+ BMBase *parent);
BMBase *clone() const override;
- void construct(const QJsonObject &definition);
+ void construct(const QJsonObject &definition, const QVersionNumber &version);
void updateProperties(int frame) override;
void render(LottieRenderer &renderer) const override;
diff --git a/src/bodymovin/bmround.cpp b/src/bodymovin/bmround.cpp
index 387bf0f..c152981 100644
--- a/src/bodymovin/bmround.cpp
+++ b/src/bodymovin/bmround.cpp
@@ -42,10 +42,10 @@ BMRound::BMRound(const BMRound &other)
m_radius = other.m_radius;
}
-BMRound::BMRound(const QJsonObject &definition, BMBase *parent)
+BMRound::BMRound(const QJsonObject &definition, const QVersionNumber &version, BMBase *parent)
{
setParent(parent);
- construct(definition);
+ construct(definition, version);
}
BMBase *BMRound::clone() const
@@ -53,7 +53,7 @@ BMBase *BMRound::clone() const
return new BMRound(*this);
}
-void BMRound::construct(const QJsonObject &definition)
+void BMRound::construct(const QJsonObject &definition, const QVersionNumber &version)
{
BMBase::parse(definition);
if (m_hidden)
@@ -63,11 +63,11 @@ void BMRound::construct(const QJsonObject &definition)
QJsonObject position = definition.value(QLatin1String("p")).toObject();
position = resolveExpression(position);
- m_position.construct(position);
+ m_position.construct(position, version);
QJsonObject radius = definition.value(QLatin1String("r")).toObject();
radius = resolveExpression(radius);
- m_radius.construct(radius);
+ m_radius.construct(radius, version);
}
void BMRound::updateProperties(int frame)
diff --git a/src/bodymovin/bmround_p.h b/src/bodymovin/bmround_p.h
index ffdf656..fc2dcb3 100644
--- a/src/bodymovin/bmround_p.h
+++ b/src/bodymovin/bmround_p.h
@@ -61,11 +61,11 @@ class BODYMOVIN_EXPORT BMRound : public BMShape
public:
BMRound() = default;
explicit BMRound(const BMRound &other);
- BMRound(const QJsonObject &definition, BMBase *parent = nullptr);
+ BMRound(const QJsonObject &definition, const QVersionNumber &version, BMBase *parent = nullptr);
BMBase *clone() const override;
- void construct(const QJsonObject &definition);
+ void construct(const QJsonObject &definition, const QVersionNumber &version);
void updateProperties(int frame) override;
void render(LottieRenderer &renderer) const override;
diff --git a/src/bodymovin/bmshape.cpp b/src/bodymovin/bmshape.cpp
index 6b4793b..0d8ff9f 100644
--- a/src/bodymovin/bmshape.cpp
+++ b/src/bodymovin/bmshape.cpp
@@ -61,7 +61,7 @@ BMBase *BMShape::clone() const
return new BMShape(*this);
}
-BMShape *BMShape::construct(QJsonObject definition, BMBase *parent)
+BMShape *BMShape::construct(QJsonObject definition, const QVersionNumber &version, BMBase *parent)
{
qCDebug(lcLottieQtBodymovinParser) << "BMShape::construct()";
@@ -82,77 +82,77 @@ BMShape *BMShape::construct(QJsonObject definition, BMBase *parent)
case BM_SHAPE_TAG('g', 'r'):
{
qCDebug(lcLottieQtBodymovinParser) << "Parse group";
- shape = new BMGroup(definition, parent);
+ shape = new BMGroup(definition, version, parent);
shape->setType(BM_SHAPE_GROUP_IX);
break;
}
case BM_SHAPE_TAG('r', 'c'):
{
qCDebug(lcLottieQtBodymovinParser) << "Parse m_rect";
- shape = new BMRect(definition, parent);
+ shape = new BMRect(definition, version, parent);
shape->setType(BM_SHAPE_RECT_IX);
break;
}
case BM_SHAPE_TAG('f', 'l'):
{
qCDebug(lcLottieQtBodymovinParser) << "Parse fill";
- shape = new BMFill(definition, parent);
+ shape = new BMFill(definition, version, parent);
shape->setType(BM_SHAPE_FILL_IX);
break;
}
case BM_SHAPE_TAG('g', 'f'):
{
qCDebug(lcLottieQtBodymovinParser) << "Parse group fill";
- shape = new BMGFill(definition, parent);
+ shape = new BMGFill(definition, version, parent);
shape->setType(BM_SHAPE_GFILL_IX);
break;
}
case BM_SHAPE_TAG('s', 't'):
{
qCDebug(lcLottieQtBodymovinParser) << "Parse stroke";
- shape = new BMStroke(definition, parent);
+ shape = new BMStroke(definition, version, parent);
shape->setType(BM_SHAPE_STROKE_IX);
break;
}
case BM_SHAPE_TAG('t', 'r'):
{
qCDebug(lcLottieQtBodymovinParser) << "Parse shape transform";
- shape = new BMShapeTransform(definition, parent);
+ shape = new BMShapeTransform(definition, version, parent);
shape->setType(BM_SHAPE_TRANS_IX);
break;
}
case BM_SHAPE_TAG('e', 'l'):
{
qCDebug(lcLottieQtBodymovinParser) << "Parse ellipse";
- shape = new BMEllipse(definition, parent);
+ shape = new BMEllipse(definition, version, parent);
shape->setType(BM_SHAPE_ELLIPSE_IX);
break;
}
case BM_SHAPE_TAG('r', 'd'):
{
qCDebug(lcLottieQtBodymovinParser) << "Parse round";
- shape = new BMRound(definition, parent);
+ shape = new BMRound(definition, version, parent);
shape->setType(BM_SHAPE_ROUND_IX);
break;
}
case BM_SHAPE_TAG('s', 'h'):
{
qCDebug(lcLottieQtBodymovinParser) << "Parse shape";
- shape = new BMFreeFormShape(definition, parent);
+ shape = new BMFreeFormShape(definition, version, parent);
shape->setType(BM_SHAPE_SHAPE_IX);
break;
}
case BM_SHAPE_TAG('t', 'm'):
{
qCDebug(lcLottieQtBodymovinParser) << "Parse trim path";
- shape = new BMTrimPath(definition, parent);
+ shape = new BMTrimPath(definition, version, parent);
shape->setType(BM_SHAPE_TRIM_IX);
break;
}
case BM_SHAPE_TAG('r', 'p'):
{
qCDebug(lcLottieQtBodymovinParser) << "Parse trim path";
- shape = new BMRepeater(definition, parent);
+ shape = new BMRepeater(definition, version, parent);
shape->setType(BM_SHAPE_REPEATER_IX);
break;
}
diff --git a/src/bodymovin/bmshape_p.h b/src/bodymovin/bmshape_p.h
index c25265d..515a967 100644
--- a/src/bodymovin/bmshape_p.h
+++ b/src/bodymovin/bmshape_p.h
@@ -75,7 +75,8 @@ public:
BMBase *clone() const override;
- static BMShape *construct(QJsonObject definition, BMBase *parent = nullptr);
+ static BMShape *construct(QJsonObject definition, const QVersionNumber &version,
+ BMBase *parent = nullptr);
virtual const QPainterPath &path() const;
virtual bool acceptsTrim() const;
diff --git a/src/bodymovin/bmshapelayer.cpp b/src/bodymovin/bmshapelayer.cpp
index 587f9c8..43f1bf7 100644
--- a/src/bodymovin/bmshapelayer.cpp
+++ b/src/bodymovin/bmshapelayer.cpp
@@ -51,9 +51,10 @@ BMShapeLayer::BMShapeLayer(const BMShapeLayer &other)
m_appliedTrim = other.m_appliedTrim;
}
-BMShapeLayer::BMShapeLayer(const QJsonObject &definition)
+BMShapeLayer::BMShapeLayer(const QJsonObject &definition, const QVersionNumber &version)
{
m_type = BM_LAYER_SHAPE_IX;
+ m_version = version;
BMLayer::parse(definition);
if (m_hidden)
@@ -70,13 +71,13 @@ BMShapeLayer::BMShapeLayer(const QJsonObject &definition)
}
QJsonObject trans = definition.value(QLatin1String("ks")).toObject();
- m_layerTransform = new BMBasicTransform(trans, this);
+ m_layerTransform = new BMBasicTransform(trans, version, this);
QJsonArray items = definition.value(QLatin1String("shapes")).toArray();
QJsonArray::const_iterator itemIt = items.constEnd();
while (itemIt != items.constBegin()) {
itemIt--;
- BMShape *shape = BMShape::construct((*itemIt).toObject(), this);
+ BMShape *shape = BMShape::construct((*itemIt).toObject(), version, this);
if (shape)
appendChild(shape);
}
diff --git a/src/bodymovin/bmshapelayer_p.h b/src/bodymovin/bmshapelayer_p.h
index 54137fd..77ccfae 100644
--- a/src/bodymovin/bmshapelayer_p.h
+++ b/src/bodymovin/bmshapelayer_p.h
@@ -57,7 +57,7 @@ class BODYMOVIN_EXPORT BMShapeLayer : public BMLayer
public:
BMShapeLayer() = default;
explicit BMShapeLayer(const BMShapeLayer &other);
- BMShapeLayer(const QJsonObject &definition);
+ BMShapeLayer(const QJsonObject &definition, const QVersionNumber &version);
~BMShapeLayer() override;
BMBase *clone() const override;
diff --git a/src/bodymovin/bmshapetransform.cpp b/src/bodymovin/bmshapetransform.cpp
index 973560b..1f9c693 100644
--- a/src/bodymovin/bmshapetransform.cpp
+++ b/src/bodymovin/bmshapetransform.cpp
@@ -45,10 +45,11 @@ BMShapeTransform::BMShapeTransform(const BMShapeTransform &other)
m_shearAngle = other.m_shearAngle;
}
-BMShapeTransform::BMShapeTransform(const QJsonObject &definition, BMBase *parent)
+BMShapeTransform::BMShapeTransform(const QJsonObject &definition, const QVersionNumber &version,
+ BMBase *parent)
{
setParent(parent);
- construct(definition);
+ construct(definition, version);
}
BMBase *BMShapeTransform::clone() const
@@ -56,19 +57,19 @@ BMBase *BMShapeTransform::clone() const
return new BMShapeTransform(*this);
}
-void BMShapeTransform::construct(const QJsonObject &definition)
+void BMShapeTransform::construct(const QJsonObject &definition, const QVersionNumber &version)
{
- BMBasicTransform::construct(definition);
+ BMBasicTransform::construct(definition, version);
qCDebug(lcLottieQtBodymovinParser) << "BMShapeTransform::construct():" << BMShape::name();
QJsonObject skew = definition.value(QLatin1String("sk")).toObject();
skew = resolveExpression(skew);
- m_skew.construct(skew);
+ m_skew.construct(skew, version);
QJsonObject skewAxis = definition.value(QLatin1String("sa")).toObject();
skewAxis = resolveExpression(skewAxis);
- m_skewAxis.construct(skewAxis);
+ m_skewAxis.construct(skewAxis, version);
}
void BMShapeTransform::updateProperties(int frame)
diff --git a/src/bodymovin/bmshapetransform_p.h b/src/bodymovin/bmshapetransform_p.h
index f44534d..725d9ef 100644
--- a/src/bodymovin/bmshapetransform_p.h
+++ b/src/bodymovin/bmshapetransform_p.h
@@ -55,11 +55,11 @@ class BODYMOVIN_EXPORT BMShapeTransform : public BMBasicTransform
{
public:
explicit BMShapeTransform(const BMShapeTransform &other);
- BMShapeTransform(const QJsonObject &definition, BMBase *parent);
+ BMShapeTransform(const QJsonObject &definition, const QVersionNumber &version, BMBase *parent);
BMBase *clone() const override;
- void construct(const QJsonObject &definition);
+ void construct(const QJsonObject &definition, const QVersionNumber &version);
void updateProperties(int frame) override;
void render(LottieRenderer &renderer) const override;
diff --git a/src/bodymovin/bmspatialproperty_p.h b/src/bodymovin/bmspatialproperty_p.h
index 1c9b96c..99b2d0d 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) {
diff --git a/src/bodymovin/bmstroke.cpp b/src/bodymovin/bmstroke.cpp
index 998ff4b..e04a125 100644
--- a/src/bodymovin/bmstroke.cpp
+++ b/src/bodymovin/bmstroke.cpp
@@ -46,7 +46,7 @@ BMStroke::BMStroke(const BMStroke &other)
m_miterLimit = other.m_miterLimit;
}
-BMStroke::BMStroke(const QJsonObject &definition, BMBase *parent)
+BMStroke::BMStroke(const QJsonObject &definition, const QVersionNumber &version, BMBase *parent)
{
setParent(parent);
@@ -89,15 +89,15 @@ BMStroke::BMStroke(const QJsonObject &definition, BMBase *parent)
QJsonObject opacity = definition.value(QLatin1String("o")).toObject();
opacity = resolveExpression(opacity);
- m_opacity.construct(opacity);
+ m_opacity.construct(opacity, version);
QJsonObject width = definition.value(QLatin1String("w")).toObject();
width = resolveExpression(width);
- m_width.construct(width);
+ m_width.construct(width, version);
QJsonObject color = definition.value(QLatin1String("c")).toObject();
color = resolveExpression(color);
- m_color.construct(color);
+ m_color.construct(color, version);
}
BMBase *BMStroke::clone() const
diff --git a/src/bodymovin/bmstroke_p.h b/src/bodymovin/bmstroke_p.h
index e92fd97..43ef9b4 100644
--- a/src/bodymovin/bmstroke_p.h
+++ b/src/bodymovin/bmstroke_p.h
@@ -54,7 +54,8 @@ class BODYMOVIN_EXPORT BMStroke : public BMShape
public:
BMStroke() = default;
explicit BMStroke(const BMStroke &other);
- BMStroke(const QJsonObject &definition, BMBase *parent = nullptr);
+ BMStroke(const QJsonObject &definition, const QVersionNumber &version,
+ BMBase *parent = nullptr);
BMBase *clone() const override;
diff --git a/src/bodymovin/bmtrimpath.cpp b/src/bodymovin/bmtrimpath.cpp
index 724c332..ae2a99e 100644
--- a/src/bodymovin/bmtrimpath.cpp
+++ b/src/bodymovin/bmtrimpath.cpp
@@ -41,12 +41,12 @@ BMTrimPath::BMTrimPath()
m_appliedTrim = this;
}
-BMTrimPath::BMTrimPath(const QJsonObject &definition, BMBase *parent)
+BMTrimPath::BMTrimPath(const QJsonObject &definition, const QVersionNumber &version, BMBase *parent)
{
m_appliedTrim = this;
setParent(parent);
- construct(definition);
+ construct(definition, version);
}
BMTrimPath::BMTrimPath(const BMTrimPath &other)
@@ -63,7 +63,7 @@ BMBase *BMTrimPath::clone() const
return new BMTrimPath(*this);
}
-void BMTrimPath::construct(const QJsonObject &definition)
+void BMTrimPath::construct(const QJsonObject &definition, const QVersionNumber &version)
{
BMBase::parse(definition);
if (m_hidden)
@@ -73,15 +73,15 @@ void BMTrimPath::construct(const QJsonObject &definition)
QJsonObject start = definition.value(QLatin1String("s")).toObject();
start = resolveExpression(start);
- m_start.construct(start);
+ m_start.construct(start, version);
QJsonObject end = definition.value(QLatin1String("e")).toObject();
end = resolveExpression(end);
- m_end.construct(end);
+ m_end.construct(end, version);
QJsonObject offset = definition.value(QLatin1String("o")).toObject();
offset = resolveExpression(offset);
- m_offset.construct(offset);
+ m_offset.construct(offset, version);
int simultaneous = true;
if (definition.contains(QLatin1String("m"))) {
diff --git a/src/bodymovin/bmtrimpath_p.h b/src/bodymovin/bmtrimpath_p.h
index cf86da2..4f5d022 100644
--- a/src/bodymovin/bmtrimpath_p.h
+++ b/src/bodymovin/bmtrimpath_p.h
@@ -53,14 +53,15 @@ class BODYMOVIN_EXPORT BMTrimPath : public BMShape
{
public:
BMTrimPath();
- BMTrimPath(const QJsonObject &definition, BMBase *parent = nullptr);
+ BMTrimPath(const QJsonObject &definition, const QVersionNumber &version,
+ BMBase *parent = nullptr);
explicit BMTrimPath(const BMTrimPath &other);
void inherit(const BMTrimPath &other);
BMBase *clone() const override;
- void construct(const QJsonObject &definition);
+ void construct(const QJsonObject &definition, const QVersionNumber &version);
void updateProperties(int frame) override;
void render(LottieRenderer &renderer) const override;
diff --git a/src/imports/lottieanimation.cpp b/src/imports/lottieanimation.cpp
index 6a12bbd..26c787b 100644
--- a/src/imports/lottieanimation.cpp
+++ b/src/imports/lottieanimation.cpp
@@ -341,6 +341,11 @@ int LottieAnimation::currentFrame() const
return m_currentFrame;
}
+QVersionNumber LottieAnimation::version() const
+{
+ return m_version;
+}
+
/*!
\qmlproperty int LottieAnimation::frameRate
@@ -681,6 +686,12 @@ int LottieAnimation::parse(QByteArray jsonSource)
if (Q_UNLIKELY(rootObj.empty()))
return -1;
+ QStringList versionString = rootObj.value(QLatin1String("v")).toString().split(u'.');
+ QList<int> version;
+ foreach (QString v, versionString)
+ version.append(v.toInt());
+ m_version = QVersionNumber(version);
+
int startFrame = rootObj.value(QLatin1String("ip")).toVariant().toInt();
int endFrame = rootObj.value(QLatin1String("op")).toVariant().toInt();
m_animFrameRate = rootObj.value(QLatin1String("fr")).toVariant().toInt();
diff --git a/src/imports/lottieanimation.h b/src/imports/lottieanimation.h
index e1b8323..987cc58 100644
--- a/src/imports/lottieanimation.h
+++ b/src/imports/lottieanimation.h
@@ -97,6 +97,8 @@ public:
int endFrame() const;
int currentFrame() const;
+ QVersionNumber version() const;
+
Q_INVOKABLE void start();
Q_INVOKABLE void play();
@@ -145,6 +147,7 @@ protected:
QMetaObject::Connection m_waitForFrameConn;
Status m_status = Null;
+ QVersionNumber m_version = QVersionNumber();
int m_startFrame = 0;
int m_endFrame = 0;
int m_currentFrame = 0;
diff --git a/src/imports/rasterrenderer/batchrenderer.cpp b/src/imports/rasterrenderer/batchrenderer.cpp
index c6b36db..8d31513 100644
--- a/src/imports/rasterrenderer/batchrenderer.cpp
+++ b/src/imports/rasterrenderer/batchrenderer.cpp
@@ -112,7 +112,7 @@ void BatchRenderer::registerAnimator(LottieAnimation *animator)
entry->currentFrame = animator->startFrame();
entry->animDir = animator->direction();
entry->bmTreeBlueprint = new BMBase;
- parse(entry->bmTreeBlueprint, animator->jsonSource());
+ parse(entry->bmTreeBlueprint, animator->jsonSource(), animator->version());
m_waitCondition.wakeAll();
}
@@ -236,7 +236,8 @@ void BatchRenderer::run()
}
}
-int BatchRenderer::parse(BMBase *rootElement, const QByteArray &jsonSource) const
+int BatchRenderer::parse(BMBase *rootElement, const QByteArray &jsonSource,
+ const QVersionNumber &version) const
{
QJsonDocument doc = QJsonDocument::fromJson(jsonSource);
QJsonObject rootObj = doc.object();
@@ -265,7 +266,7 @@ int BatchRenderer::parse(BMBase *rootElement, const QByteArray &jsonSource) cons
QString refId = jsonLayer.value("refId").toString();
jsonLayer.insert("asset", assets.value(refId));
}
- BMLayer *layer = BMLayer::construct(jsonLayer);
+ BMLayer *layer = BMLayer::construct(jsonLayer, version);
if (layer) {
layer->setParent(rootElement);
// Mask layers must be rendered before the layers they affect to
diff --git a/src/imports/rasterrenderer/batchrenderer.h b/src/imports/rasterrenderer/batchrenderer.h
index 47fcb9a..94bd1b1 100644
--- a/src/imports/rasterrenderer/batchrenderer.h
+++ b/src/imports/rasterrenderer/batchrenderer.h
@@ -39,6 +39,7 @@ QT_BEGIN_NAMESPACE
class BMBase;
class QImage;
+class QVersionNumber;
class LottieAnimation;
class BatchRenderer : public QThread
@@ -81,7 +82,8 @@ public slots:
protected:
void run() override;
- int parse(BMBase *rootElement, const QByteArray &jsonSource) const;
+ int parse(BMBase *rootElement, const QByteArray &jsonSource,
+ const QVersionNumber &version) const;
void prerender(Entry *animEntry);
diff --git a/tests/auto/bodymovin/shape/ellipse/tst_bmellipse.cpp b/tests/auto/bodymovin/shape/ellipse/tst_bmellipse.cpp
index 021adde..ffca2fc 100644
--- a/tests/auto/bodymovin/shape/ellipse/tst_bmellipse.cpp
+++ b/tests/auto/bodymovin/shape/ellipse/tst_bmellipse.cpp
@@ -283,6 +283,12 @@ void tst_BMEllipse::loadTestData(const QByteArray &filename)
if (rootObj.empty())
QFAIL("Cannot parse test file");
+ QStringList vs = rootObj.value(QLatin1String("v")).toString().split(u'.');
+ QList<int> vi;
+ foreach (QString v, vs)
+ vi.append(v.toInt());
+ QVersionNumber version = QVersionNumber(vi);
+
QJsonArray layers = rootObj.value(QLatin1String("layers")).toArray();
QJsonObject layerObj = layers[0].toObject();
int type = layerObj.value(QLatin1String("ty")).toInt();
@@ -294,7 +300,7 @@ void tst_BMEllipse::loadTestData(const QByteArray &filename)
BMShape* shape = nullptr;
while (shapesIt != shapes.end()) {
QJsonObject childObj = (*shapesIt).toObject();
- shape = BMShape::construct(childObj);
+ shape = BMShape::construct(childObj, version);
QVERIFY(shape != nullptr);
if (shape->type() == BM_SHAPE_ELLIPSE_IX)
break;
diff --git a/tests/auto/bodymovin/shape/fill/tst_bmfill.cpp b/tests/auto/bodymovin/shape/fill/tst_bmfill.cpp
index 70a86d7..81de85f 100644
--- a/tests/auto/bodymovin/shape/fill/tst_bmfill.cpp
+++ b/tests/auto/bodymovin/shape/fill/tst_bmfill.cpp
@@ -204,6 +204,12 @@ void tst_BMFill::loadTestData(const QByteArray &filename)
if (rootObj.empty())
QFAIL("Cannot parse test file");
+ QStringList vs = rootObj.value(QLatin1String("v")).toString().split(u'.');
+ QList<int> vi;
+ foreach (QString v, vs)
+ vi.append(v.toInt());
+ QVersionNumber version = QVersionNumber(vi);
+
QJsonArray layers = rootObj.value(QLatin1String("layers")).toArray();
QJsonObject layerObj = layers[0].toObject();
int type = layerObj.value(QLatin1String("ty")).toInt();
@@ -215,7 +221,7 @@ void tst_BMFill::loadTestData(const QByteArray &filename)
BMShape* shape = nullptr;
while (shapesIt != shapes.end()) {
QJsonObject childObj = (*shapesIt).toObject();
- shape = BMShape::construct(childObj);
+ shape = BMShape::construct(childObj, version);
QVERIFY(shape != nullptr);
if (shape->type() == BM_SHAPE_FILL_IX)
break;
diff --git a/tests/auto/bodymovin/shape/path/tst_bmpath.cpp b/tests/auto/bodymovin/shape/path/tst_bmpath.cpp
index b029e24..8e1f968 100644
--- a/tests/auto/bodymovin/shape/path/tst_bmpath.cpp
+++ b/tests/auto/bodymovin/shape/path/tst_bmpath.cpp
@@ -1132,6 +1132,12 @@ void tst_BMPath::loadTestData(const QByteArray &filename)
if (rootObj.empty())
QFAIL("Cannot parse test file");
+ QStringList vs = rootObj.value(QLatin1String("v")).toString().split(u'.');
+ QList<int> vi;
+ foreach (QString v, vs)
+ vi.append(v.toInt());
+ QVersionNumber version = QVersionNumber(vi);
+
QJsonArray layers = rootObj.value(QLatin1String("layers")).toArray();
QJsonObject layerObj = layers[0].toObject();
int type = layerObj.value(QLatin1String("ty")).toInt();
@@ -1143,7 +1149,7 @@ void tst_BMPath::loadTestData(const QByteArray &filename)
BMShape* shape = nullptr;
while (shapesIt != shapes.end()) {
QJsonObject childObj = (*shapesIt).toObject();
- shape = BMShape::construct(childObj);
+ shape = BMShape::construct(childObj, version);
QVERIFY(shape != nullptr);
if (shape->type() == BM_SHAPE_SHAPE_IX)
break;
diff --git a/tests/auto/bodymovin/shape/rect/tst_bmrect.cpp b/tests/auto/bodymovin/shape/rect/tst_bmrect.cpp
index 6efccda..c0d76e5 100644
--- a/tests/auto/bodymovin/shape/rect/tst_bmrect.cpp
+++ b/tests/auto/bodymovin/shape/rect/tst_bmrect.cpp
@@ -317,6 +317,12 @@ void tst_BMRect::loadTestData(const QByteArray &filename)
if (rootObj.empty())
QFAIL("Cannot parse test file");
+ QStringList vs = rootObj.value(QLatin1String("v")).toString().split(u'.');
+ QList<int> vi;
+ foreach (QString v, vs)
+ vi.append(v.toInt());
+ QVersionNumber version = QVersionNumber(vi);
+
QJsonArray layers = rootObj.value(QLatin1String("layers")).toArray();
QJsonObject layerObj = layers[0].toObject();
int type = layerObj.value(QLatin1String("ty")).toInt();
@@ -328,7 +334,7 @@ void tst_BMRect::loadTestData(const QByteArray &filename)
BMShape* shape = nullptr;
while (shapesIt != shapes.end()) {
QJsonObject childObj = (*shapesIt).toObject();
- shape = BMShape::construct(childObj);
+ shape = BMShape::construct(childObj, version);
QVERIFY(shape != nullptr);
if (shape->type() == BM_SHAPE_RECT_IX)
break;
diff --git a/tests/auto/bodymovin/shape/repeater/tst_bmrepeater.cpp b/tests/auto/bodymovin/shape/repeater/tst_bmrepeater.cpp
index 98d8228..24b561f 100644
--- a/tests/auto/bodymovin/shape/repeater/tst_bmrepeater.cpp
+++ b/tests/auto/bodymovin/shape/repeater/tst_bmrepeater.cpp
@@ -199,6 +199,12 @@ void tst_BMRepeater::loadTestData(const QByteArray &filename)
if (rootObj.empty())
QFAIL("Cannot parse test file");
+ QStringList vs = rootObj.value(QLatin1String("v")).toString().split(u'.');
+ QList<int> vi;
+ foreach (QString v, vs)
+ vi.append(v.toInt());
+ QVersionNumber version = QVersionNumber(vi);
+
QJsonArray layers = rootObj.value(QLatin1String("layers")).toArray();
QJsonObject layerObj = layers[0].toObject();
int type = layerObj.value(QLatin1String("ty")).toInt();
@@ -210,7 +216,7 @@ void tst_BMRepeater::loadTestData(const QByteArray &filename)
BMShape* shape = nullptr;
while (shapesIt != shapes.end()) {
QJsonObject childObj = (*shapesIt).toObject();
- shape = BMShape::construct(childObj);
+ shape = BMShape::construct(childObj, version);
QVERIFY(shape != nullptr);
if (shape->type() == BM_SHAPE_REPEATER_IX)
break;
diff --git a/tests/auto/bodymovin/shape/repeatertransform/tst_bmrepeatertransform.cpp b/tests/auto/bodymovin/shape/repeatertransform/tst_bmrepeatertransform.cpp
index e6f2e41..88d2b27 100644
--- a/tests/auto/bodymovin/shape/repeatertransform/tst_bmrepeatertransform.cpp
+++ b/tests/auto/bodymovin/shape/repeatertransform/tst_bmrepeatertransform.cpp
@@ -428,6 +428,12 @@ void tst_BMRepeaterTransform::loadTestData(const QByteArray &filename)
if (rootObj.empty())
QFAIL("Cannot parse test file");
+ QStringList vs = rootObj.value(QLatin1String("v")).toString().split(u'.');
+ QList<int> vi;
+ foreach (QString v, vs)
+ vi.append(v.toInt());
+ QVersionNumber version = QVersionNumber(vi);
+
QJsonArray layers = rootObj.value(QLatin1String("layers")).toArray();
QJsonObject layerObj = layers[0].toObject();
int type = layerObj.value(QLatin1String("ty")).toInt();
@@ -439,7 +445,7 @@ void tst_BMRepeaterTransform::loadTestData(const QByteArray &filename)
BMShape* shape = nullptr;
while (shapesIt != shapes.end()) {
QJsonObject childObj = (*shapesIt).toObject();
- shape = BMShape::construct(childObj);
+ shape = BMShape::construct(childObj, version);
QVERIFY(shape != nullptr);
if (shape->type() == BM_SHAPE_REPEATER_IX)
break;
diff --git a/tests/auto/bodymovin/shape/shapelayer/tst_bmshapelayer.cpp b/tests/auto/bodymovin/shape/shapelayer/tst_bmshapelayer.cpp
index 6454ab7..266f199 100644
--- a/tests/auto/bodymovin/shape/shapelayer/tst_bmshapelayer.cpp
+++ b/tests/auto/bodymovin/shape/shapelayer/tst_bmshapelayer.cpp
@@ -172,6 +172,12 @@ void tst_BMShapeLayer::loadTestData(const QByteArray &filename)
if (rootObj.empty())
QFAIL("Cannot parse test file");
+ QStringList vs = rootObj.value(QLatin1String("v")).toString().split(u'.');
+ QList<int> vi;
+ foreach (QString v, vs)
+ vi.append(v.toInt());
+ QVersionNumber version = QVersionNumber(vi);
+
m_width = rootObj.value(QLatin1String("w")).toVariant().toReal();
m_height = rootObj.value(QLatin1String("h")).toVariant().toReal();
@@ -180,7 +186,7 @@ void tst_BMShapeLayer::loadTestData(const QByteArray &filename)
int type = layerObj.value(QLatin1String("ty")).toInt();
if (type != 4)
QFAIL("It's not shape layer");
- m_layer = new BMShapeLayer(layerObj);
+ m_layer = new BMShapeLayer(layerObj, version);
QVERIFY(m_layer != nullptr);
if (layers.size() > 1) {
@@ -188,7 +194,7 @@ void tst_BMShapeLayer::loadTestData(const QByteArray &filename)
type = layerObj.value(QLatin1String("ty")).toInt();
if (type != 4)
QFAIL("it's not shape layer");
- m_clippedlayer = new BMShapeLayer(layerObj);
+ m_clippedlayer = new BMShapeLayer(layerObj, version);
QVERIFY(m_clippedlayer != nullptr);
}
}
diff --git a/tests/auto/bodymovin/shape/shapetransform/tst_bmshapetransform.cpp b/tests/auto/bodymovin/shape/shapetransform/tst_bmshapetransform.cpp
index 3fbe5f8..61c36aa 100644
--- a/tests/auto/bodymovin/shape/shapetransform/tst_bmshapetransform.cpp
+++ b/tests/auto/bodymovin/shape/shapetransform/tst_bmshapetransform.cpp
@@ -484,12 +484,18 @@ void tst_BMShapeTransform::loadTestData(const QByteArray &filename)
if (type != 4)
QFAIL("It's not shape layer");
+ QStringList vs = rootObj.value(QLatin1String("v")).toString().split(u'.');
+ QList<int> vi;
+ foreach (QString v, vs)
+ vi.append(v.toInt());
+ QVersionNumber version = QVersionNumber(vi);
+
QJsonArray shapes = layerObj.value(QLatin1String("shapes")).toArray();
QJsonArray::const_iterator shapesIt = shapes.constBegin();
BMGroup* group = nullptr;
while (shapesIt != shapes.end()) {
QJsonObject childObj = (*shapesIt).toObject();
- BMShape *shape = BMShape::construct(childObj);
+ BMShape *shape = BMShape::construct(childObj, version);
QVERIFY(shape != nullptr);
if (shape->type() == BM_SHAPE_GROUP_IX) {
group = static_cast<BMGroup *>(shape);
diff --git a/tests/auto/bodymovin/shape/stroke/tst_bmstroke.cpp b/tests/auto/bodymovin/shape/stroke/tst_bmstroke.cpp
index faa036f..c2faa5f 100644
--- a/tests/auto/bodymovin/shape/stroke/tst_bmstroke.cpp
+++ b/tests/auto/bodymovin/shape/stroke/tst_bmstroke.cpp
@@ -317,6 +317,12 @@ void tst_BMStroke::loadTestData(const QByteArray &filename)
if (rootObj.empty())
QFAIL("Cannot parse test file");
+ QStringList vs = rootObj.value(QLatin1String("v")).toString().split(u'.');
+ QList<int> vi;
+ foreach (QString v, vs)
+ vi.append(v.toInt());
+ QVersionNumber version = QVersionNumber(vi);
+
QJsonArray layers = rootObj.value(QLatin1String("layers")).toArray();
QJsonObject layerObj = layers[0].toObject();
int type = layerObj.value(QLatin1String("ty")).toInt();
@@ -328,7 +334,7 @@ void tst_BMStroke::loadTestData(const QByteArray &filename)
BMShape* shape = nullptr;
while (shapesIt != shapes.end()) {
QJsonObject childObj = (*shapesIt).toObject();
- shape = BMShape::construct(childObj);
+ shape = BMShape::construct(childObj, version);
QVERIFY(shape != nullptr);
if (shape->type() == BM_SHAPE_STROKE_IX)
break;
diff --git a/tests/auto/bodymovin/shape/transform/tst_bmbasictransform.cpp b/tests/auto/bodymovin/shape/transform/tst_bmbasictransform.cpp
index 912dbe1..a8491fa 100644
--- a/tests/auto/bodymovin/shape/transform/tst_bmbasictransform.cpp
+++ b/tests/auto/bodymovin/shape/transform/tst_bmbasictransform.cpp
@@ -392,6 +392,12 @@ void tst_BMBasicTransform::loadTestData(const QByteArray &filename)
if (rootObj.empty())
QFAIL("Cannot parse test file");
+ QStringList vs = rootObj.value(QLatin1String("v")).toString().split(u'.');
+ QList<int> vi;
+ foreach (QString v, vs)
+ vi.append(v.toInt());
+ QVersionNumber version = QVersionNumber(vi);
+
QJsonArray layers = rootObj.value(QLatin1String("layers")).toArray();
QJsonObject layerObj = layers[0].toObject();
int type = layerObj.value(QLatin1String("ty")).toInt();
@@ -399,7 +405,7 @@ void tst_BMBasicTransform::loadTestData(const QByteArray &filename)
QFAIL("It's not shape layer");
QJsonObject transformObj = layerObj.value(QLatin1String("ks")).toObject();
- m_transform = new BMBasicTransform(transformObj);
+ m_transform = new BMBasicTransform(transformObj, version);
QVERIFY(m_transform != nullptr);
}
diff --git a/tests/auto/bodymovin/shape/trimpath/tst_bmtrimpath.cpp b/tests/auto/bodymovin/shape/trimpath/tst_bmtrimpath.cpp
index dcab10e..fd446af 100644
--- a/tests/auto/bodymovin/shape/trimpath/tst_bmtrimpath.cpp
+++ b/tests/auto/bodymovin/shape/trimpath/tst_bmtrimpath.cpp
@@ -279,6 +279,12 @@ void tst_BMTrimPath::loadTestData(const QByteArray &filename)
if (rootObj.empty())
QFAIL("Cannot parse test file");
+ QStringList vs = rootObj.value(QLatin1String("v")).toString().split(u'.');
+ QList<int> vi;
+ foreach (QString v, vs)
+ vi.append(v.toInt());
+ QVersionNumber version = QVersionNumber(vi);
+
QJsonArray layers = rootObj.value(QLatin1String("layers")).toArray();
QJsonObject layerObj = layers[0].toObject();
int type = layerObj.value(QLatin1String("ty")).toInt();
@@ -290,7 +296,7 @@ void tst_BMTrimPath::loadTestData(const QByteArray &filename)
BMShape* shape = nullptr;
while (shapesIt != shapes.end()) {
QJsonObject childObj = (*shapesIt).toObject();
- shape = BMShape::construct(childObj);
+ shape = BMShape::construct(childObj, version);
QVERIFY(shape != nullptr);
if (shape->type() == BM_SHAPE_TRIM_IX)
break;