Clarify ownership for keyframes
diff --git a/include/rive/animation/keyed_object.hpp b/include/rive/animation/keyed_object.hpp
index b22c9a5..39fab61 100644
--- a/include/rive/animation/keyed_object.hpp
+++ b/include/rive/animation/keyed_object.hpp
@@ -7,11 +7,12 @@
class KeyedProperty;
class KeyedObject : public KeyedObjectBase {
private:
- std::vector<KeyedProperty*> m_KeyedProperties;
+ std::vector<std::unique_ptr<KeyedProperty>> m_KeyedProperties;
public:
+ KeyedObject();
~KeyedObject();
- void addKeyedProperty(KeyedProperty* property);
+ void addKeyedProperty(std::unique_ptr<KeyedProperty>);
StatusCode onAddedDirty(CoreContext* context) override;
StatusCode onAddedClean(CoreContext* context) override;
diff --git a/include/rive/animation/keyed_property.hpp b/include/rive/animation/keyed_property.hpp
index 3470683..29aaebd 100644
--- a/include/rive/animation/keyed_property.hpp
+++ b/include/rive/animation/keyed_property.hpp
@@ -6,11 +6,12 @@
class KeyFrame;
class KeyedProperty : public KeyedPropertyBase {
private:
- std::vector<KeyFrame*> m_KeyFrames;
+ std::vector<std::unique_ptr<KeyFrame>> m_KeyFrames;
public:
+ KeyedProperty();
~KeyedProperty();
- void addKeyFrame(KeyFrame* keyframe);
+ void addKeyFrame(std::unique_ptr<KeyFrame>);
StatusCode onAddedClean(CoreContext* context) override;
StatusCode onAddedDirty(CoreContext* context) override;
diff --git a/include/rive/importers/keyed_object_importer.hpp b/include/rive/importers/keyed_object_importer.hpp
index 945d4d2..6530267 100644
--- a/include/rive/importers/keyed_object_importer.hpp
+++ b/include/rive/importers/keyed_object_importer.hpp
@@ -13,7 +13,7 @@
public:
KeyedObjectImporter(KeyedObject* keyedObject);
- void addKeyedProperty(KeyedProperty* property);
+ void addKeyedProperty(std::unique_ptr<KeyedProperty>);
};
} // namespace rive
#endif
diff --git a/include/rive/importers/keyed_property_importer.hpp b/include/rive/importers/keyed_property_importer.hpp
index a07d50d..e5e9e16 100644
--- a/include/rive/importers/keyed_property_importer.hpp
+++ b/include/rive/importers/keyed_property_importer.hpp
@@ -15,7 +15,7 @@
public:
KeyedPropertyImporter(LinearAnimation* animation, KeyedProperty* keyedProperty);
- void addKeyFrame(KeyFrame* keyFrame);
+ void addKeyFrame(std::unique_ptr<KeyFrame>);
bool readNullObject() override;
};
} // namespace rive
diff --git a/src/animation/keyed_object.cpp b/src/animation/keyed_object.cpp
index 2c60f02..3b48962 100644
--- a/src/animation/keyed_object.cpp
+++ b/src/animation/keyed_object.cpp
@@ -6,13 +6,11 @@
using namespace rive;
-KeyedObject::~KeyedObject() {
- for (auto property : m_KeyedProperties) {
- delete property;
- }
-}
-void KeyedObject::addKeyedProperty(KeyedProperty* property) {
- m_KeyedProperties.push_back(property);
+KeyedObject::KeyedObject() {}
+KeyedObject::~KeyedObject() {}
+
+void KeyedObject::addKeyedProperty(std::unique_ptr<KeyedProperty> property) {
+ m_KeyedProperties.push_back(std::move(property));
}
StatusCode KeyedObject::onAddedDirty(CoreContext* context) {
@@ -21,7 +19,7 @@
return StatusCode::MissingObject;
}
- for (auto property : m_KeyedProperties) {
+ for (auto& property : m_KeyedProperties) {
StatusCode code;
if ((code = property->onAddedDirty(context)) != StatusCode::Ok) {
return code;
@@ -31,7 +29,7 @@
}
StatusCode KeyedObject::onAddedClean(CoreContext* context) {
- for (auto property : m_KeyedProperties) {
+ for (auto& property : m_KeyedProperties) {
property->onAddedClean(context);
}
return StatusCode::Ok;
@@ -42,7 +40,7 @@
if (object == nullptr) {
return;
}
- for (auto property : m_KeyedProperties) {
+ for (auto& property : m_KeyedProperties) {
property->apply(object, time, mix);
}
}
diff --git a/src/animation/keyed_property.cpp b/src/animation/keyed_property.cpp
index 8c7891c..d952451 100644
--- a/src/animation/keyed_property.cpp
+++ b/src/animation/keyed_property.cpp
@@ -6,13 +6,12 @@
using namespace rive;
-KeyedProperty::~KeyedProperty() {
- for (auto keyframe : m_KeyFrames) {
- delete keyframe;
- }
-}
+KeyedProperty::KeyedProperty() {}
+KeyedProperty::~KeyedProperty() {}
-void KeyedProperty::addKeyFrame(KeyFrame* keyframe) { m_KeyFrames.push_back(keyframe); }
+void KeyedProperty::addKeyFrame(std::unique_ptr<KeyFrame> keyframe) {
+ m_KeyFrames.push_back(std::move(keyframe));
+}
void KeyedProperty::apply(Core* object, float seconds, float mix) {
assert(!m_KeyFrames.empty());
@@ -42,8 +41,8 @@
m_KeyFrames[0]->apply(object, pk, mix);
} else {
if (idx < numKeyFrames) {
- KeyFrame* fromFrame = m_KeyFrames[idx - 1];
- KeyFrame* toFrame = m_KeyFrames[idx];
+ KeyFrame* fromFrame = m_KeyFrames[idx - 1].get();
+ KeyFrame* toFrame = m_KeyFrames[idx].get();
if (seconds == toFrame->seconds()) {
toFrame->apply(object, pk, mix);
} else {
@@ -61,7 +60,7 @@
StatusCode KeyedProperty::onAddedDirty(CoreContext* context) {
StatusCode code;
- for (auto keyframe : m_KeyFrames) {
+ for (auto& keyframe : m_KeyFrames) {
if ((code = keyframe->onAddedDirty(context)) != StatusCode::Ok) {
return code;
}
@@ -71,7 +70,7 @@
StatusCode KeyedProperty::onAddedClean(CoreContext* context) {
StatusCode code;
- for (auto keyframe : m_KeyFrames) {
+ for (auto& keyframe : m_KeyFrames) {
if ((code = keyframe->onAddedClean(context)) != StatusCode::Ok) {
return code;
}
@@ -84,6 +83,6 @@
if (importer == nullptr) {
return StatusCode::MissingObject;
}
- importer->addKeyedProperty(this);
+ importer->addKeyedProperty(std::unique_ptr<KeyedProperty>(this));
return Super::import(importStack);
}
diff --git a/src/animation/keyframe.cpp b/src/animation/keyframe.cpp
index 5190b89..c0eaf9a 100644
--- a/src/animation/keyframe.cpp
+++ b/src/animation/keyframe.cpp
@@ -26,6 +26,6 @@
if (importer == nullptr) {
return StatusCode::MissingObject;
}
- importer->addKeyFrame(this);
+ importer->addKeyFrame(std::unique_ptr<KeyFrame>(this));
return Super::import(importStack);
}
\ No newline at end of file
diff --git a/src/importers/keyed_object_importer.cpp b/src/importers/keyed_object_importer.cpp
index 8cbbf1f..c8477c3 100644
--- a/src/importers/keyed_object_importer.cpp
+++ b/src/importers/keyed_object_importer.cpp
@@ -7,6 +7,6 @@
KeyedObjectImporter::KeyedObjectImporter(KeyedObject* keyedObject) : m_KeyedObject(keyedObject) {}
-void KeyedObjectImporter::addKeyedProperty(KeyedProperty* property) {
- m_KeyedObject->addKeyedProperty(property);
+void KeyedObjectImporter::addKeyedProperty(std::unique_ptr<KeyedProperty> property) {
+ m_KeyedObject->addKeyedProperty(std::move(property));
}
\ No newline at end of file
diff --git a/src/importers/keyed_property_importer.cpp b/src/importers/keyed_property_importer.cpp
index a664e1a..6789b0f 100644
--- a/src/importers/keyed_property_importer.cpp
+++ b/src/importers/keyed_property_importer.cpp
@@ -9,9 +9,9 @@
KeyedProperty* keyedProperty) :
m_Animation(animation), m_KeyedProperty(keyedProperty) {}
-void KeyedPropertyImporter::addKeyFrame(KeyFrame* keyFrame) {
+void KeyedPropertyImporter::addKeyFrame(std::unique_ptr<KeyFrame> keyFrame) {
keyFrame->computeSeconds(m_Animation->fps());
- m_KeyedProperty->addKeyFrame(keyFrame);
+ m_KeyedProperty->addKeyFrame(std::move(keyFrame));
}
bool KeyedPropertyImporter::readNullObject() {