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::unique_ptr<LOTLayerNode> mLayerCNode;
88 std::vector<VDrawable *> mDrawableList;
89 std::vector<std::unique_ptr<LOTMaskItem>> mMasks;
90 LOTLayerData *mLayerData{nullptr};
91 LOTLayerItem *mParentLayer{nullptr};
92 LOTLayerItem *mPrecompLayer{nullptr};
93 VMatrix mCombinedMatrix;
94 float mCombinedAlpha{0.0};
96 DirtyFlag mDirtyFlag{DirtyFlagBit::All};
100 class LOTCompLayerItem: public LOTLayerItem
103 LOTCompLayerItem(LOTLayerData *layerData);
104 void renderList(std::vector<VDrawable *> &list)final;
105 void updateStaticProperty() final;
106 void render(VPainter *painter, const VRle &mask, const VRle &inheritMatte, LOTLayerItem *matteSource) final;
107 void buildLayerNode() final;
109 void updateContent() final;
111 std::vector<LOTLayerNode *> mLayersCNode;
112 std::vector<std::unique_ptr<LOTLayerItem>> mLayers;
116 class LOTSolidLayerItem: public LOTLayerItem
119 LOTSolidLayerItem(LOTLayerData *layerData);
120 void buildLayerNode() final;
122 void updateContent() final;
123 void renderList(std::vector<VDrawable *> &list) final;
125 std::vector<LOTNode *> mCNodeList;
126 std::unique_ptr<VDrawable> mRenderNode;
129 class LOTContentItem;
130 class LOTContentGroupItem;
131 class LOTShapeLayerItem: public LOTLayerItem
134 LOTShapeLayerItem(LOTLayerData *layerData);
135 static std::unique_ptr<LOTContentItem> createContentItem(LOTData *contentData);
136 void renderList(std::vector<VDrawable *> &list)final;
137 void buildLayerNode() final;
139 void updateContent() final;
140 std::vector<LOTNode *> mCNodeList;
141 std::unique_ptr<LOTContentGroupItem> mRoot;
144 class LOTNullLayerItem: public LOTLayerItem
147 LOTNullLayerItem(LOTLayerData *layerData);
149 void updateContent() final;
155 LOTMaskItem(LOTMaskData *data): mData(data), mCombinedAlpha(0){}
156 void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag);
157 LOTMaskData::Mode maskMode() const { return mData->mMode;}
161 float mCombinedAlpha;
162 VMatrix mCombinedMatrix;
164 std::future<VRle> mRleTask;
168 class LOTDrawable : public VDrawable
173 std::unique_ptr<LOTNode> mCNode;
176 if (mCNode && mCNode->mGradient.stopPtr)
177 free(mCNode->mGradient.stopPtr);
181 class LOTPathDataItem;
182 class LOTPaintDataItem;
188 virtual ~LOTContentItem()= default;
189 virtual void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) = 0;
190 virtual void renderList(std::vector<VDrawable *> &){}
191 void setParent(LOTContentItem *parent) {mParent = parent;}
192 LOTContentItem *parent() const {return mParent;}
194 LOTContentItem *mParent{nullptr};
197 class LOTContentGroupItem: public LOTContentItem
200 LOTContentGroupItem(LOTShapeGroupData *data);
201 void addChildren(LOTGroupData *data);
202 void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final;
204 void processTrimItems(std::vector<LOTPathDataItem *> &list);
205 void processPaintItems(std::vector<LOTPathDataItem *> &list);
206 void renderList(std::vector<VDrawable *> &list) final;
207 const VMatrix & matrix() const { return mMatrix;}
209 LOTShapeGroupData *mData;
210 std::vector<std::unique_ptr<LOTContentItem>> mContents;
214 class LOTPathDataItem : public LOTContentItem
217 LOTPathDataItem(bool staticPath): mStaticPath(staticPath){}
218 void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final;
219 bool dirty() const {return mPathChanged;}
220 const VPath &localPath() const {return mTemp;}
221 const VPath &finalPath();
222 void updatePath(const VPath &path) {mTemp.clone(path); mPathChanged = true; mNeedUpdate = true;}
223 bool staticPath() const { return mStaticPath; }
225 virtual void updatePath(VPath& path, int frameNo) = 0;
226 virtual bool hasChanged(int prevFrame, int curFrame) = 0;
228 bool hasChanged(int frameNo) {
229 int prevFrame = mFrameNo;
231 if (prevFrame == -1) return true;
233 (prevFrame == frameNo)) return false;
234 return hasChanged(prevFrame, frameNo);
240 bool mPathChanged{true};
241 bool mNeedUpdate{true};
245 class LOTRectItem: public LOTPathDataItem
248 LOTRectItem(LOTRectData *data);
250 void updatePath(VPath& path, int frameNo) final;
253 bool hasChanged(int prevFrame, int curFrame) final {
254 return (mData->mPos.changed(prevFrame, curFrame) ||
255 mData->mSize.changed(prevFrame, curFrame) ||
256 mData->mRound.changed(prevFrame, curFrame)) ? true : false;
260 class LOTEllipseItem: public LOTPathDataItem
263 LOTEllipseItem(LOTEllipseData *data);
265 void updatePath(VPath& path, int frameNo) final;
266 LOTEllipseData *mData;
267 bool hasChanged(int prevFrame, int curFrame) final {
268 return (mData->mPos.changed(prevFrame, curFrame) ||
269 mData->mSize.changed(prevFrame, curFrame)) ? true : false;
273 class LOTShapeItem: public LOTPathDataItem
276 LOTShapeItem(LOTShapeData *data);
278 void updatePath(VPath& path, int frameNo) final;
280 bool hasChanged(int prevFrame, int curFrame) final {
281 return mData->mShape.changed(prevFrame, curFrame);
285 class LOTPolystarItem: public LOTPathDataItem
288 LOTPolystarItem(LOTPolystarData *data);
290 void updatePath(VPath& path, int frameNo) final;
291 LOTPolystarData *mData;
293 bool hasChanged(int prevFrame, int curFrame) final {
294 return (mData->mPos.changed(prevFrame, curFrame) ||
295 mData->mPointCount.changed(prevFrame, curFrame) ||
296 mData->mInnerRadius.changed(prevFrame, curFrame) ||
297 mData->mOuterRadius.changed(prevFrame, curFrame) ||
298 mData->mInnerRoundness.changed(prevFrame, curFrame) ||
299 mData->mOuterRoundness.changed(prevFrame, curFrame) ||
300 mData->mRotation.changed(prevFrame, curFrame)) ? true : false;
306 class LOTPaintDataItem : public LOTContentItem
309 LOTPaintDataItem(bool staticContent);
310 void addPathItems(std::vector<LOTPathDataItem *> &list, int startOffset);
311 void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) override;
312 void renderList(std::vector<VDrawable *> &list) final;
314 virtual void updateContent(int frameNo) = 0;
315 virtual void updateRenderNode();
316 inline float parentAlpha() const {return mParentAlpha;}
322 std::vector<LOTPathDataItem *> mPathItems;
323 std::unique_ptr<VDrawable> mDrawable;
325 bool mRenderNodeUpdate{true};
328 class LOTFillItem : public LOTPaintDataItem
331 LOTFillItem(LOTFillData *data);
333 void updateContent(int frameNo) final;
334 void updateRenderNode() final;
341 class LOTGFillItem : public LOTPaintDataItem
344 LOTGFillItem(LOTGFillData *data);
346 void updateContent(int frameNo) final;
347 void updateRenderNode() final;
350 std::unique_ptr<VGradient> mGradient;
354 class LOTStrokeItem : public LOTPaintDataItem
357 LOTStrokeItem(LOTStrokeData *data);
359 void updateContent(int frameNo) final;
360 void updateRenderNode() final;
362 LOTStrokeData *mData;
372 class LOTGStrokeItem : public LOTPaintDataItem
375 LOTGStrokeItem(LOTGStrokeData *data);
377 void updateContent(int frameNo) final;
378 void updateRenderNode() final;
380 LOTGStrokeData *mData;
381 std::unique_ptr<VGradient> mGradient;
394 class LOTTrimItem : public LOTContentItem
397 LOTTrimItem(LOTTrimData *data);
398 void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final;
400 void addPathItems(std::vector<LOTPathDataItem *> &list, int startOffset);
402 bool pathDirty() const {
403 for (auto &i : mPathItems) {
411 LOTTrimData::Segment mSegment{};
414 std::vector<LOTPathDataItem *> mPathItems;
419 class LOTRepeaterItem : public LOTContentItem
422 LOTRepeaterItem(LOTRepeaterData *data);
423 void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final;
424 void renderList(std::vector<VDrawable *> &list) final;
426 LOTRepeaterData *mData;
430 #endif // LOTTIEITEM_H