From: Jaeun Choi Date: Thu, 19 Jul 2018 11:20:32 +0000 (+0900) Subject: lottie: handle trim path X-Git-Tag: submit/tizen/20180917.042405~215 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4067491267afd40647c65a58c3b75e4b4baf9a74;p=platform%2Fcore%2Fuifw%2Flottie-player.git lottie: handle trim path Change-Id: I05f1daec3c7e0c4cbb953c5c0a076d81e82d8e30 --- diff --git a/src/lottie/lottieitem.cpp b/src/lottie/lottieitem.cpp index a48777b..06797d1 100644 --- a/src/lottie/lottieitem.cpp +++ b/src/lottie/lottieitem.cpp @@ -5,7 +5,6 @@ #include"vdasher.h" #include - VDrawable::VDrawable():mFlag(DirtyState::All), mType(Type::Fill), mFillRule(FillRule::Winding) @@ -608,6 +607,7 @@ LOTShapeLayerItem::LOTShapeLayerItem(LOTLayerData *layerData):LOTLayerItem(layer mRoot = new LOTContentGroupItem(nullptr); mRoot->addChildren(layerData); mRoot->processPaintOperation(); + mRoot->processTrimOperation(); } LOTShapeLayerItem::~LOTShapeLayerItem() @@ -658,6 +658,10 @@ LOTContentItem * LOTShapeLayerItem::createContentItem(LOTData *contentData) return new LOTRepeaterItem(static_cast(contentData)); break; } + case LOTData::Type::Trim: { + return new LOTTrimItem(static_cast(contentData)); + break; + } default: return nullptr; break; @@ -765,9 +769,42 @@ void LOTPathDataItem::addPaintOperation(std::vector &list, i } } +void LOTContentGroupItem::processTrimOperation() +{ + std::vector list; + trimOperationHelper(list); +} + +void LOTContentGroupItem::trimOperationHelper(std::vector &list) +{ + int curOpCount = list.size(); + for (auto i = mContents.rbegin(); i != mContents.rend(); ++i) { + auto child = *i; + if (auto pathNode = dynamic_cast(child)) { + // the node is a path data node add the paint operation list to it. + pathNode->addTrimOperation(list); + } else if (auto trimNode = dynamic_cast(child)) { + // add it to the trim operation list + list.push_back(trimNode); + } else if (auto groupNode = dynamic_cast(child)) { + // update the groups node with current list + groupNode->trimOperationHelper(list); + } + } + list.erase(list.begin() + curOpCount, list.end()); +} + +void LOTPathDataItem::addTrimOperation(std::vector &list) +{ + for(auto trimItem : list) { + mTrimNodeRefs.push_back(trimItem); + } +} void LOTPathDataItem::update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) { + VPath tempPath; + mPathChanged = false; mCombinedAlpha = parentAlpha; @@ -778,12 +815,28 @@ void LOTPathDataItem::update(int frameNo, const VMatrix &parentMatrix, float par mPathChanged = true; } + tempPath = mLocalPath; + // 2. apply path operation if needed - // TODO + if (mTrimNodeRefs.size() > 0) + { + //TODO apply more than one trim path if necessary + VPathMesure pm; + float s = mTrimNodeRefs.front()->getStart(frameNo); + float e = mTrimNodeRefs.front()->getEnd(frameNo); + + pm.setPath(mLocalPath); + pm.setStart(s); + pm.setEnd(e); + tempPath = pm.getPath(); + + mPathChanged = true; + } // 3. compute the final path with parentMatrix + if ((flag & DirtyFlagBit::Matrix) || mPathChanged) { - mFinalPath = mLocalPath; + mFinalPath = tempPath; mFinalPath.transform(parentMatrix); mPathChanged = true; } @@ -1051,7 +1104,10 @@ void LOTGStrokeItem::updateRenderNode(LOTPathDataItem *pathNode, VDrawable *draw LOTTrimItem::LOTTrimItem(LOTTrimData *data):mData(data) { +} +void LOTTrimItem::update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) +{ } LOTRepeaterItem::LOTRepeaterItem(LOTRepeaterData *data):mData(data) diff --git a/src/lottie/lottieitem.h b/src/lottie/lottieitem.h index 259aeeb..1ef9610 100644 --- a/src/lottie/lottieitem.h +++ b/src/lottie/lottieitem.h @@ -8,6 +8,7 @@ #include"vmatrix.h" #include"vpath.h" #include"vpoint.h" +#include"vpathmesure.h" #include"lottieplayer.h" #include"vbrush.h" #include"vpainter.h" @@ -202,6 +203,7 @@ public: class LOTNode; class LOTPathDataItem; class LOTPaintDataItem; +class LOTTrimItem; struct LOTRenderNode { LOTRenderNode(LOTPathDataItem *path, LOTPaintDataItem *paint, VDrawable *render, bool sameG) @@ -229,9 +231,11 @@ public: void addChildren(LOTGroupData *data); void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final; void processPaintOperation(); + void processTrimOperation(); void renderList(std::vector &list) final; private: void paintOperationHelper(std::vector &list); + void trimOperationHelper(std::vector &list); LOTShapeGroupData *mData; std::vector mContents; }; @@ -243,9 +247,11 @@ public: void addPaintOperation(std::vector &list, int externalCount); void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final; VPath path() const; + void addTrimOperation(std::vector &list); inline float combinedAlpha() const{ return mCombinedAlpha;} void renderList(std::vector &list) final; private: + std::vector mTrimNodeRefs; std::vector mRenderList; std::vector> mNodeList; bool mInit; @@ -386,6 +392,9 @@ class LOTTrimItem : public LOTContentItem { public: LOTTrimItem(LOTTrimData *data); + void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final; + float getStart(int frameNo) {return mData->mStart.value(frameNo);} + float getEnd(int frameNo) {return mData->mEnd.value(frameNo);} private: LOTTrimData *mData; };