: mRootModel(model), mUpdateViewBox(false), mCurFrameNo(-1)
{
mCompData = model->mRoot.get();
- mRootLayer = std::unique_ptr<LOTLayerItem>(createLayerItem(mCompData->mRootLayer.get()));
+ mRootLayer = createLayerItem(mCompData->mRootLayer.get());
mRootLayer->updateStaticProperty();
mViewSize = mCompData->size();
}
-LOTLayerItem *LOTCompItem::createLayerItem(LOTLayerData *layerData)
+std::unique_ptr<LOTLayerItem>
+LOTCompItem::createLayerItem(LOTLayerData *layerData)
{
switch (layerData->mLayerType) {
case LayerType::Precomp: {
- return new LOTCompLayerItem(layerData);
+ return std::make_unique<LOTCompLayerItem>(layerData);
break;
}
case LayerType::Solid: {
- return new LOTSolidLayerItem(layerData);
+ return std::make_unique<LOTSolidLayerItem>(layerData);
break;
}
case LayerType::Shape: {
- return new LOTShapeLayerItem(layerData);
+ return std::make_unique<LOTShapeLayerItem>(layerData);
break;
}
case LayerType::Null: {
- return new LOTNullLayerItem(layerData);
+ return std::make_unique<LOTNullLayerItem>(layerData);
break;
}
default:
for (auto &i : mLayerData->mChildren) {
LOTLayerData *layerModel = dynamic_cast<LOTLayerData *>(i.get());
if (layerModel) {
- LOTLayerItem *layerItem = LOTCompItem::createLayerItem(layerModel);
- if (layerItem) mLayers.push_back(layerItem);
+ auto layerItem = LOTCompItem::createLayerItem(layerModel);
+ if (layerItem) mLayers.push_back(std::move(layerItem));
}
}
if (id >= 0) {
auto search = std::find_if(mLayers.begin(), mLayers.end(),
[id](const auto& val){ return val->id() == id;});
- if (search != mLayers.end()) i->setParentLayer(*search);
+ if (search != mLayers.end()) i->setParentLayer((*search).get());
}
// update the precomp layer if its not the root layer.
if (!layerModel->root()) i->setPrecompLayer(this);
LOTLayerItem *matteLayer = nullptr;
for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) {
- LOTLayerItem *layer = *i;
+ LOTLayerItem *layer = (*i).get();
if (!matteLayer && layer->hasMatte()) {
matteLayer = layer;
}
}
-LOTCompLayerItem::~LOTCompLayerItem()
-{
- for (auto &i : mLayers) {
- delete i;
- }
-}
-
void LOTCompLayerItem::updateContent()
{
// update the layer from back to front
for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) {
- LOTLayerItem *layer = *i;
- layer->update(frameNo(), combinedMatrix(), combinedAlpha());
+ (*i)->update(frameNo(), combinedMatrix(), combinedAlpha());
}
}
// update the layer from back to front
for (auto i = mLayers.rbegin(); i != mLayers.rend(); ++i) {
- LOTLayerItem *layer = *i;
- layer->renderList(list);
+ (*i)->renderList(list);
}
}
{
public:
LOTCompItem(LOTModel *model);
- static LOTLayerItem * createLayerItem(LOTLayerData *layerData);
+ static std::unique_ptr<LOTLayerItem> createLayerItem(LOTLayerData *layerData);
bool update(int frameNo);
void resize(const VSize &size);
VSize size() const;
class LOTCompLayerItem: public LOTLayerItem
{
public:
- ~LOTCompLayerItem();
LOTCompLayerItem(LOTLayerData *layerData);
void renderList(std::vector<VDrawable *> &list)final;
void updateStaticProperty() final;
protected:
void updateContent() final;
private:
- std::vector<LOTLayerItem *> mLayers;
+ std::vector<std::unique_ptr<LOTLayerItem>> mLayers;
int mLastFrame;
};