4 #include<lottiemodel.h>
11 #include"vpathmesure.h"
12 #include"lottiecommon.h"
13 #include"lottieanimation.h"
19 enum class DirtyFlagBit : uchar
24 All = (Matrix | Alpha)
34 LOTCompItem(LOTModel *model);
35 static std::unique_ptr<LOTLayerItem> createLayerItem(LOTLayerData *layerData);
36 bool update(int frameNo);
37 void resize(const VSize &size);
39 const std::vector<LOTNode *>& renderList()const;
40 void buildRenderList();
41 void buildRenderTree();
42 const LOTLayerNode * renderTree()const;
43 bool render(const lottie::Surface &surface);
48 LOTCompositionData *mCompData;
49 std::unique_ptr<LOTLayerItem> mRootLayer;
52 std::vector<LOTNode *> mRenderList;
53 std::vector<VDrawable *> mDrawableList;
56 typedef vFlag<DirtyFlagBit> DirtyFlag;
60 LOTLayerItem(LOTLayerData *layerData);
61 virtual ~LOTLayerItem()= default;
62 int id() const {return mLayerData->id();}
63 int parentId() const {return mLayerData->parentId();}
64 void setParentLayer(LOTLayerItem *parent){mParentLayer = parent;}
65 void setPrecompLayer(LOTLayerItem *precomp){mPrecompLayer = precomp;}
66 virtual void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha);
67 VMatrix matrix(int frameNo) const;
68 virtual void renderList(std::vector<VDrawable *> &){}
69 virtual void updateStaticProperty();
70 virtual void render(VPainter *painter, const VRle &mask, const VRle &inheritMatte, LOTLayerItem *matteSource);
71 bool hasMatte() { if (mLayerData->mMatteType == MatteType::None) return false; return true; }
72 MatteType matteType() const { return mLayerData->mMatteType;}
74 virtual void buildLayerNode();
75 LOTLayerNode * layerNode() const {return mLayerCNode.get();}
77 virtual void updateContent() = 0;
78 inline VMatrix combinedMatrix() const {return mCombinedMatrix;}
79 inline int frameNo() const {return mFrameNo;}
80 inline float combinedAlpha() const {return mCombinedAlpha;}
81 inline bool isStatic() const {return mStatic;}
82 float opacity(int frameNo) const;
83 inline DirtyFlag flag() const {return mDirtyFlag;}
84 VRle maskRle(const VRect &clipRect);
85 bool hasMask() const {return !mMasks.empty();}
87 std::vector<LOTMask> mMasksCNode;
88 std::unique_ptr<LOTLayerNode> mLayerCNode;
89 std::vector<VDrawable *> mDrawableList;
90 std::vector<std::unique_ptr<LOTMaskItem>> mMasks;
91 LOTLayerData *mLayerData{nullptr};
92 LOTLayerItem *mParentLayer{nullptr};
93 LOTLayerItem *mPrecompLayer{nullptr};
94 VMatrix mCombinedMatrix;
95 float mCombinedAlpha{0.0};
97 DirtyFlag mDirtyFlag{DirtyFlagBit::All};
101 class LOTCompLayerItem: public LOTLayerItem
104 LOTCompLayerItem(LOTLayerData *layerData);
105 void renderList(std::vector<VDrawable *> &list)final;
106 void updateStaticProperty() final;
107 void render(VPainter *painter, const VRle &mask, const VRle &inheritMatte, LOTLayerItem *matteSource) final;
108 void buildLayerNode() final;
110 void updateContent() final;
112 std::vector<LOTLayerNode *> mLayersCNode;
113 std::vector<std::unique_ptr<LOTLayerItem>> mLayers;
117 class LOTSolidLayerItem: public LOTLayerItem
120 LOTSolidLayerItem(LOTLayerData *layerData);
121 void buildLayerNode() final;
123 void updateContent() final;
124 void renderList(std::vector<VDrawable *> &list) final;
126 std::vector<LOTNode *> mCNodeList;
127 std::unique_ptr<VDrawable> mRenderNode;
130 class LOTContentItem;
131 class LOTContentGroupItem;
132 class LOTShapeLayerItem: public LOTLayerItem
135 LOTShapeLayerItem(LOTLayerData *layerData);
136 static std::unique_ptr<LOTContentItem> createContentItem(LOTData *contentData);
137 void renderList(std::vector<VDrawable *> &list)final;
138 void buildLayerNode() final;
140 void updateContent() final;
141 std::vector<LOTNode *> mCNodeList;
142 std::unique_ptr<LOTContentGroupItem> mRoot;
145 class LOTNullLayerItem: public LOTLayerItem
148 LOTNullLayerItem(LOTLayerData *layerData);
150 void updateContent() final;
156 LOTMaskItem(LOTMaskData *data): mData(data), mCombinedAlpha(0){}
157 void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag);
158 LOTMaskData::Mode maskMode() const { return mData->mMode;}
162 float mCombinedAlpha;
163 VMatrix mCombinedMatrix;
166 std::future<VRle> mRleTask;
170 class LOTDrawable : public VDrawable
175 std::unique_ptr<LOTNode> mCNode;
178 if (mCNode && mCNode->mGradient.stopPtr)
179 free(mCNode->mGradient.stopPtr);
183 class LOTPathDataItem;
184 class LOTPaintDataItem;
190 virtual ~LOTContentItem()= default;
191 virtual void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) = 0;
192 virtual void renderList(std::vector<VDrawable *> &){}
193 void setParent(LOTContentItem *parent) {mParent = parent;}
194 LOTContentItem *parent() const {return mParent;}
196 LOTContentItem *mParent{nullptr};
199 class LOTContentGroupItem: public LOTContentItem
202 LOTContentGroupItem(){}
203 LOTContentGroupItem(LOTGroupData *data);
204 void addChildren(LOTGroupData *data);
205 void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag);
207 void processTrimItems(std::vector<LOTPathDataItem *> &list);
208 void processPaintItems(std::vector<LOTPathDataItem *> &list);
209 void renderList(std::vector<VDrawable *> &list) final;
210 const VMatrix & matrix() const { return mMatrix;}
212 LOTGroupData *mData{nullptr};
213 std::vector<std::unique_ptr<LOTContentItem>> mContents;
217 class LOTPathDataItem : public LOTContentItem
220 LOTPathDataItem(bool staticPath): mStaticPath(staticPath){}
221 void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final;
222 bool dirty() const {return mPathChanged;}
223 const VPath &localPath() const {return mTemp;}
224 const VPath &finalPath();
225 void updatePath(const VPath &path) {mTemp.clone(path); mPathChanged = true; mNeedUpdate = true;}
226 bool staticPath() const { return mStaticPath; }
228 virtual void updatePath(VPath& path, int frameNo) = 0;
229 virtual bool hasChanged(int prevFrame, int curFrame) = 0;
231 bool hasChanged(int frameNo) {
232 int prevFrame = mFrameNo;
234 if (prevFrame == -1) return true;
236 (prevFrame == frameNo)) return false;
237 return hasChanged(prevFrame, frameNo);
243 bool mPathChanged{true};
244 bool mNeedUpdate{true};
248 class LOTRectItem: public LOTPathDataItem
251 LOTRectItem(LOTRectData *data);
253 void updatePath(VPath& path, int frameNo) final;
256 bool hasChanged(int prevFrame, int curFrame) final {
257 return (mData->mPos.changed(prevFrame, curFrame) ||
258 mData->mSize.changed(prevFrame, curFrame) ||
259 mData->mRound.changed(prevFrame, curFrame)) ? true : false;
263 class LOTEllipseItem: public LOTPathDataItem
266 LOTEllipseItem(LOTEllipseData *data);
268 void updatePath(VPath& path, int frameNo) final;
269 LOTEllipseData *mData;
270 bool hasChanged(int prevFrame, int curFrame) final {
271 return (mData->mPos.changed(prevFrame, curFrame) ||
272 mData->mSize.changed(prevFrame, curFrame)) ? true : false;
276 class LOTShapeItem: public LOTPathDataItem
279 LOTShapeItem(LOTShapeData *data);
281 void updatePath(VPath& path, int frameNo) final;
283 bool hasChanged(int prevFrame, int curFrame) final {
284 return mData->mShape.changed(prevFrame, curFrame);
288 class LOTPolystarItem: public LOTPathDataItem
291 LOTPolystarItem(LOTPolystarData *data);
293 void updatePath(VPath& path, int frameNo) final;
294 LOTPolystarData *mData;
296 bool hasChanged(int prevFrame, int curFrame) final {
297 return (mData->mPos.changed(prevFrame, curFrame) ||
298 mData->mPointCount.changed(prevFrame, curFrame) ||
299 mData->mInnerRadius.changed(prevFrame, curFrame) ||
300 mData->mOuterRadius.changed(prevFrame, curFrame) ||
301 mData->mInnerRoundness.changed(prevFrame, curFrame) ||
302 mData->mOuterRoundness.changed(prevFrame, curFrame) ||
303 mData->mRotation.changed(prevFrame, curFrame)) ? true : false;
309 class LOTPaintDataItem : public LOTContentItem
312 LOTPaintDataItem(bool staticContent);
313 void addPathItems(std::vector<LOTPathDataItem *> &list, int startOffset);
314 void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) override;
315 void renderList(std::vector<VDrawable *> &list) final;
317 virtual void updateContent(int frameNo) = 0;
318 virtual void updateRenderNode();
319 inline float parentAlpha() const {return mParentAlpha;}
325 std::vector<LOTPathDataItem *> mPathItems;
326 std::unique_ptr<VDrawable> mDrawable;
328 bool mRenderNodeUpdate{true};
331 class LOTFillItem : public LOTPaintDataItem
334 LOTFillItem(LOTFillData *data);
336 void updateContent(int frameNo) final;
337 void updateRenderNode() final;
344 class LOTGFillItem : public LOTPaintDataItem
347 LOTGFillItem(LOTGFillData *data);
349 void updateContent(int frameNo) final;
350 void updateRenderNode() final;
353 std::unique_ptr<VGradient> mGradient;
357 class LOTStrokeItem : public LOTPaintDataItem
360 LOTStrokeItem(LOTStrokeData *data);
362 void updateContent(int frameNo) final;
363 void updateRenderNode() final;
365 LOTStrokeData *mData;
375 class LOTGStrokeItem : public LOTPaintDataItem
378 LOTGStrokeItem(LOTGStrokeData *data);
380 void updateContent(int frameNo) final;
381 void updateRenderNode() final;
383 LOTGStrokeData *mData;
384 std::unique_ptr<VGradient> mGradient;
397 class LOTTrimItem : public LOTContentItem
400 LOTTrimItem(LOTTrimData *data);
401 void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final;
403 void addPathItems(std::vector<LOTPathDataItem *> &list, int startOffset);
405 bool pathDirty() const {
406 for (auto &i : mPathItems) {
414 LOTTrimData::Segment mSegment{};
417 std::vector<LOTPathDataItem *> mPathItems;
422 class LOTRepeaterItem : public LOTContentGroupItem
425 LOTRepeaterItem(LOTRepeaterData *data);
426 void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final;
428 LOTRepeaterData *mData;
432 #endif // LOTTIEITEM_H