refactor to remove all dynamic_cast usage
authorsubhransu mohanty <sub.mohanty@samsung.com>
Thu, 30 May 2019 00:17:13 +0000 (09:17 +0900)
committerHermet Park <hermetpark@gmail.com>
Wed, 19 Jun 2019 04:33:00 +0000 (13:33 +0900)
src/lottie/lottieitem.cpp
src/lottie/lottieitem.h

index d71474c8c79a53519405de7462e2c6d2cbe6fbb7..aa300007c3c791b9fc1d6c462261b8bcce60ec03 100644 (file)
@@ -997,7 +997,9 @@ bool LOTStrokeItem::resolveKeyPath(LOTKeyPath &keyPath, uint depth, LOTVariant &
     return false;
 }
 
-LOTContentGroupItem::LOTContentGroupItem(LOTGroupData *data) : mData(data)
+LOTContentGroupItem::LOTContentGroupItem(LOTGroupData *data) :
+    LOTContentItem(ContentType::Group),
+    mData(data)
 {
     addChildren(mData);
 }
@@ -1051,10 +1053,17 @@ void LOTContentGroupItem::applyTrim()
 {
     for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) {
         auto content = (*i).get();
-        if (auto trim = dynamic_cast<LOTTrimItem *>(content)) {
-            trim->update();
-        } else if (auto group = dynamic_cast<LOTContentGroupItem *>(content)) {
-            group->applyTrim();
+        switch (content->type()) {
+        case ContentType::Trim: {
+            static_cast<LOTTrimItem *>(content)->update();
+            break;
+        }
+        case ContentType::Group: {
+            static_cast<LOTContentGroupItem *>(content)->applyTrim();
+            break;
+        }
+        default:
+            break;
         }
     }
 }
@@ -1072,16 +1081,21 @@ void LOTContentGroupItem::processPaintItems(
     int curOpCount = list.size();
     for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) {
         auto content = (*i).get();
-        if (auto pathNode = dynamic_cast<LOTPathDataItem *>(content)) {
-            // add it to the list
-            list.push_back(pathNode);
-        } else if (auto paintNode = dynamic_cast<LOTPaintDataItem *>(content)) {
-            // the node is a paint data node update the path list of the paint item.
-            paintNode->addPathItems(list, curOpCount);
-        } else if (auto groupNode =
-                       dynamic_cast<LOTContentGroupItem *>(content)) {
-            // update the groups node with current list
-            groupNode->processPaintItems(list);
+        switch (content->type()) {
+        case ContentType::Path: {
+            list.push_back(static_cast<LOTPathDataItem *>(content));
+            break;
+        }
+        case ContentType::Paint: {
+            static_cast<LOTPaintDataItem *>(content)->addPathItems(list, curOpCount);
+            break;
+        }
+        case ContentType::Group: {
+            static_cast<LOTContentGroupItem *>(content)->processPaintItems(list);
+            break;
+        }
+        default:
+            break;
         }
     }
 }
@@ -1092,16 +1106,22 @@ void LOTContentGroupItem::processTrimItems(
     int curOpCount = list.size();
     for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) {
         auto content = (*i).get();
-        if (auto pathNode = dynamic_cast<LOTPathDataItem *>(content)) {
-            // add it to the list
-            list.push_back(pathNode);
-        } else if (auto trimNode = dynamic_cast<LOTTrimItem *>(content)) {
-            // the node is a paint data node update the path list of the paint item.
-            trimNode->addPathItems(list, curOpCount);
-        } else if (auto groupNode =
-                       dynamic_cast<LOTContentGroupItem *>(content)) {
-            // update the groups node with current list
-            groupNode->processTrimItems(list);
+
+        switch (content->type()) {
+        case ContentType::Path: {
+            list.push_back(static_cast<LOTPathDataItem *>(content));
+            break;
+        }
+        case ContentType::Trim: {
+            static_cast<LOTTrimItem *>(content)->addPathItems(list, curOpCount);
+            break;
+        }
+        case ContentType::Group: {
+            static_cast<LOTContentGroupItem *>(content)->processTrimItems(list);
+            break;
+        }
+        default:
+            break;
         }
     }
 }
@@ -1231,8 +1251,10 @@ void LOTPolystarItem::updatePath(VPath& path, int frameNo)
  * PaintData Node handling
  *
  */
-LOTPaintDataItem::LOTPaintDataItem(bool staticContent):mDrawable(std::make_unique<LOTDrawable>()),
-                                                       mStaticContent(staticContent){}
+LOTPaintDataItem::LOTPaintDataItem(bool staticContent):
+    LOTContentItem(ContentType::Paint),
+    mDrawable(std::make_unique<LOTDrawable>()),
+    mStaticContent(staticContent){}
 
 void LOTPaintDataItem::update(int frameNo, const VMatrix &/*parentMatrix*/,
                               float parentAlpha, const DirtyFlag &flag)
@@ -1407,7 +1429,9 @@ void LOTGStrokeItem::updateRenderNode()
     }
 }
 
-LOTTrimItem::LOTTrimItem(LOTTrimData *data) : mData(data) {}
+LOTTrimItem::LOTTrimItem(LOTTrimData *data):
+    LOTContentItem(ContentType::Trim),
+    mData(data) {}
 
 void LOTTrimItem::update(int frameNo, const VMatrix &/*parentMatrix*/,
                          float /*parentAlpha*/, const DirtyFlag &/*flag*/)
index e051945655bc103ac2d03ffa38321c5704562729..48c750175a974bc43fd8319e4c76ba6b0da94e67 100644 (file)
@@ -247,24 +247,35 @@ class LOTPathDataItem;
 class LOTPaintDataItem;
 class LOTTrimItem;
 
+enum class ContentType
+{
+    Unknown,
+    Group,
+    Path,
+    Paint,
+    Trim
+};
+
 class LOTContentItem
 {
 public:
    virtual ~LOTContentItem() = default;
+   LOTContentItem(ContentType type=ContentType::Unknown):mType(type) {}
    virtual void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) = 0;
    virtual void renderList(std::vector<VDrawable *> &){}
    void setParent(LOTContentItem *parent) {mParent = parent;}
    LOTContentItem *parent() const {return mParent;}
    virtual bool resolveKeyPath(LOTKeyPath &, uint, LOTVariant &) {return false;}
+   ContentType type() const {return mType;}
 private:
+   ContentType     mType{ContentType::Unknown};
    LOTContentItem *mParent{nullptr};
 };
 
 class LOTContentGroupItem: public LOTContentItem
 {
 public:
-    LOTContentGroupItem(){}
-   LOTContentGroupItem(LOTGroupData *data);
+   LOTContentGroupItem(LOTGroupData *data=nullptr);
    void addChildren(LOTGroupData *data);
    void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) override;
    void applyTrim();
@@ -287,7 +298,7 @@ protected:
 class LOTPathDataItem : public LOTContentItem
 {
 public:
-   LOTPathDataItem(bool staticPath): mStaticPath(staticPath){}
+   LOTPathDataItem(bool staticPath): LOTContentItem(ContentType::Path), mStaticPath(staticPath){}
    void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final;
    bool dirty() const {return mPathChanged;}
    const VPath &localPath() const {return mTemp;}