2 * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include<lottiemodel.h>
29 #include"vpathmesure.h"
30 #include"lottiecommon.h"
31 #include"lottieanimation.h"
37 enum class DirtyFlagBit : uchar
42 All = (Matrix | Alpha)
52 LOTCompItem(LOTModel *model);
53 static std::unique_ptr<LOTLayerItem> createLayerItem(LOTLayerData *layerData);
54 bool update(int frameNo);
55 void resize(const VSize &size);
57 void buildRenderTree();
58 const LOTLayerNode * renderTree()const;
59 bool render(const lottie::Surface &surface);
64 LOTCompositionData *mCompData;
65 std::unique_ptr<LOTLayerItem> mRootLayer;
68 std::vector<LOTNode *> mRenderList;
69 std::vector<VDrawable *> mDrawableList;
72 class LOTLayerMaskItem;
77 LOTClipperItem(VSize size): mSize(size){}
78 void update(const VMatrix &matrix);
87 typedef vFlag<DirtyFlagBit> DirtyFlag;
91 LOTLayerItem(LOTLayerData *layerData);
92 virtual ~LOTLayerItem()= default;
93 int id() const {return mLayerData->id();}
94 int parentId() const {return mLayerData->parentId();}
95 void setParentLayer(LOTLayerItem *parent){mParentLayer = parent;}
96 void setPrecompLayer(LOTLayerItem *precomp){mPrecompLayer = precomp;}
97 virtual void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha);
98 VMatrix matrix(int frameNo) const;
99 virtual void renderList(std::vector<VDrawable *> &){}
100 virtual void updateStaticProperty();
101 virtual void render(VPainter *painter, const VRle &mask, const VRle &matteRle);
102 bool hasMatte() { if (mLayerData->mMatteType == MatteType::None) return false; return true; }
103 MatteType matteType() const { return mLayerData->mMatteType;}
104 bool visible() const;
105 virtual void buildLayerNode();
106 LOTLayerNode * layerNode() const {return mLayerCNode.get();}
108 virtual void updateContent() = 0;
109 inline VMatrix combinedMatrix() const {return mCombinedMatrix;}
110 inline int frameNo() const {return mFrameNo;}
111 inline float combinedAlpha() const {return mCombinedAlpha;}
112 inline bool isStatic() const {return mStatic;}
113 float opacity(int frameNo) const;
114 inline DirtyFlag flag() const {return mDirtyFlag;}
116 std::vector<LOTMask> mMasksCNode;
117 std::unique_ptr<LOTLayerNode> mLayerCNode;
118 std::vector<VDrawable *> mDrawableList;
119 std::unique_ptr<LOTLayerMaskItem> mLayerMask;
120 LOTLayerData *mLayerData{nullptr};
121 LOTLayerItem *mParentLayer{nullptr};
122 LOTLayerItem *mPrecompLayer{nullptr};
123 VMatrix mCombinedMatrix;
124 float mCombinedAlpha{0.0};
126 DirtyFlag mDirtyFlag{DirtyFlagBit::All};
130 class LOTCompLayerItem: public LOTLayerItem
133 LOTCompLayerItem(LOTLayerData *layerData);
134 void renderList(std::vector<VDrawable *> &list)final;
135 void updateStaticProperty() final;
136 void render(VPainter *painter, const VRle &mask, const VRle &matteRle) final;
137 void buildLayerNode() final;
139 void updateContent() final;
141 void renderMatteLayer(VPainter *painter, const VRle &inheritMask, const VRle &matteRle,
142 LOTLayerItem *layer, LOTLayerItem *src);
144 std::vector<LOTLayerNode *> mLayersCNode;
145 std::vector<std::unique_ptr<LOTLayerItem>> mLayers;
146 std::unique_ptr<LOTClipperItem> mClipper;
149 class LOTSolidLayerItem: public LOTLayerItem
152 LOTSolidLayerItem(LOTLayerData *layerData);
153 void buildLayerNode() final;
155 void updateContent() final;
156 void renderList(std::vector<VDrawable *> &list) final;
158 std::vector<LOTNode *> mCNodeList;
159 std::unique_ptr<VDrawable> mRenderNode;
162 class LOTContentItem;
163 class LOTContentGroupItem;
164 class LOTShapeLayerItem: public LOTLayerItem
167 LOTShapeLayerItem(LOTLayerData *layerData);
168 static std::unique_ptr<LOTContentItem> createContentItem(LOTData *contentData);
169 void renderList(std::vector<VDrawable *> &list)final;
170 void buildLayerNode() final;
172 void updateContent() final;
173 std::vector<LOTNode *> mCNodeList;
174 std::unique_ptr<LOTContentGroupItem> mRoot;
177 class LOTNullLayerItem: public LOTLayerItem
180 LOTNullLayerItem(LOTLayerData *layerData);
182 void updateContent() final;
185 class LOTImageLayerItem: public LOTLayerItem
188 LOTImageLayerItem(LOTLayerData *layerData);
189 void buildLayerNode() final;
191 void updateContent() final;
192 void renderList(std::vector<VDrawable *> &list) final;
194 std::vector<LOTNode *> mCNodeList;
195 std::unique_ptr<VDrawable> mRenderNode;
201 LOTMaskItem(LOTMaskData *data): mData(data), mCombinedAlpha(0){}
202 void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag);
203 LOTMaskData::Mode maskMode() const { return mData->mMode;}
207 float mCombinedAlpha;
208 VMatrix mCombinedMatrix;
216 * Handels mask property of a layer item
218 class LOTLayerMaskItem
221 LOTLayerMaskItem(LOTLayerData *layerData);
222 void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag);
223 bool isStatic() const {return mStatic;}
224 VRle maskRle(const VRect &clipRect);
226 std::vector<LOTMaskItem> mMasks;
232 class LOTDrawable : public VDrawable
237 std::unique_ptr<LOTNode> mCNode;
240 if (mCNode && mCNode->mGradient.stopPtr)
241 free(mCNode->mGradient.stopPtr);
245 class LOTPathDataItem;
246 class LOTPaintDataItem;
252 virtual ~LOTContentItem()= default;
253 virtual void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) = 0;
254 virtual void renderList(std::vector<VDrawable *> &){}
255 void setParent(LOTContentItem *parent) {mParent = parent;}
256 LOTContentItem *parent() const {return mParent;}
258 LOTContentItem *mParent{nullptr};
261 class LOTContentGroupItem: public LOTContentItem
264 LOTContentGroupItem(){}
265 LOTContentGroupItem(LOTGroupData *data);
266 void addChildren(LOTGroupData *data);
267 void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag);
269 void processTrimItems(std::vector<LOTPathDataItem *> &list);
270 void processPaintItems(std::vector<LOTPathDataItem *> &list);
271 void renderList(std::vector<VDrawable *> &list) final;
272 const VMatrix & matrix() const { return mMatrix;}
274 LOTGroupData *mData{nullptr};
275 std::vector<std::unique_ptr<LOTContentItem>> mContents;
279 class LOTPathDataItem : public LOTContentItem
282 LOTPathDataItem(bool staticPath): mStaticPath(staticPath){}
283 void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final;
284 bool dirty() const {return mPathChanged;}
285 const VPath &localPath() const {return mTemp;}
286 const VPath &finalPath();
287 void updatePath(const VPath &path) {mTemp = path; mPathChanged = true; mNeedUpdate = true;}
288 bool staticPath() const { return mStaticPath; }
290 virtual void updatePath(VPath& path, int frameNo) = 0;
291 virtual bool hasChanged(int prevFrame, int curFrame) = 0;
293 bool hasChanged(int frameNo) {
294 int prevFrame = mFrameNo;
296 if (prevFrame == -1) return true;
298 (prevFrame == frameNo)) return false;
299 return hasChanged(prevFrame, frameNo);
305 bool mPathChanged{true};
306 bool mNeedUpdate{true};
310 class LOTRectItem: public LOTPathDataItem
313 LOTRectItem(LOTRectData *data);
315 void updatePath(VPath& path, int frameNo) final;
318 bool hasChanged(int prevFrame, int curFrame) final {
319 return (mData->mPos.changed(prevFrame, curFrame) ||
320 mData->mSize.changed(prevFrame, curFrame) ||
321 mData->mRound.changed(prevFrame, curFrame)) ? true : false;
325 class LOTEllipseItem: public LOTPathDataItem
328 LOTEllipseItem(LOTEllipseData *data);
330 void updatePath(VPath& path, int frameNo) final;
331 LOTEllipseData *mData;
332 bool hasChanged(int prevFrame, int curFrame) final {
333 return (mData->mPos.changed(prevFrame, curFrame) ||
334 mData->mSize.changed(prevFrame, curFrame)) ? true : false;
338 class LOTShapeItem: public LOTPathDataItem
341 LOTShapeItem(LOTShapeData *data);
343 void updatePath(VPath& path, int frameNo) final;
345 bool hasChanged(int prevFrame, int curFrame) final {
346 return mData->mShape.changed(prevFrame, curFrame);
350 class LOTPolystarItem: public LOTPathDataItem
353 LOTPolystarItem(LOTPolystarData *data);
355 void updatePath(VPath& path, int frameNo) final;
356 LOTPolystarData *mData;
358 bool hasChanged(int prevFrame, int curFrame) final {
359 return (mData->mPos.changed(prevFrame, curFrame) ||
360 mData->mPointCount.changed(prevFrame, curFrame) ||
361 mData->mInnerRadius.changed(prevFrame, curFrame) ||
362 mData->mOuterRadius.changed(prevFrame, curFrame) ||
363 mData->mInnerRoundness.changed(prevFrame, curFrame) ||
364 mData->mOuterRoundness.changed(prevFrame, curFrame) ||
365 mData->mRotation.changed(prevFrame, curFrame)) ? true : false;
371 class LOTPaintDataItem : public LOTContentItem
374 LOTPaintDataItem(bool staticContent);
375 void addPathItems(std::vector<LOTPathDataItem *> &list, int startOffset);
376 void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) override;
377 void renderList(std::vector<VDrawable *> &list) final;
379 virtual void updateContent(int frameNo) = 0;
380 virtual void updateRenderNode();
381 inline float parentAlpha() const {return mParentAlpha;}
383 float mParentAlpha{1.0f};
387 std::vector<LOTPathDataItem *> mPathItems;
388 std::unique_ptr<VDrawable> mDrawable;
390 bool mRenderNodeUpdate{true};
393 class LOTFillItem : public LOTPaintDataItem
396 LOTFillItem(LOTFillData *data);
398 void updateContent(int frameNo) final;
399 void updateRenderNode() final;
403 FillRule mFillRule{FillRule::Winding};
406 class LOTGFillItem : public LOTPaintDataItem
409 LOTGFillItem(LOTGFillData *data);
411 void updateContent(int frameNo) final;
412 void updateRenderNode() final;
415 std::unique_ptr<VGradient> mGradient;
416 FillRule mFillRule{FillRule::Winding};
419 class LOTStrokeItem : public LOTPaintDataItem
422 LOTStrokeItem(LOTStrokeData *data);
424 void updateContent(int frameNo) final;
425 void updateRenderNode() final;
427 LOTStrokeData *mData;
428 CapStyle mCap{CapStyle::Flat};
429 JoinStyle mJoin{JoinStyle::Miter};
430 float mMiterLimit{0};
434 int mDashArraySize{0};
437 class LOTGStrokeItem : public LOTPaintDataItem
440 LOTGStrokeItem(LOTGStrokeData *data);
442 void updateContent(int frameNo) final;
443 void updateRenderNode() final;
445 LOTGStrokeData *mData;
446 std::unique_ptr<VGradient> mGradient;
447 CapStyle mCap{CapStyle::Flat};
448 JoinStyle mJoin{JoinStyle::Miter};
449 float mMiterLimit{0};
453 int mDashArraySize{0};
459 class LOTTrimItem : public LOTContentItem
462 LOTTrimItem(LOTTrimData *data);
463 void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final;
465 void addPathItems(std::vector<LOTPathDataItem *> &list, int startOffset);
467 bool pathDirty() const {
468 for (auto &i : mPathItems) {
476 LOTTrimData::Segment mSegment{};
479 std::vector<LOTPathDataItem *> mPathItems;
484 class LOTRepeaterItem : public LOTContentGroupItem
487 LOTRepeaterItem(LOTRepeaterData *data);
488 void update(int frameNo, const VMatrix &parentMatrix, float parentAlpha, const DirtyFlag &flag) final;
490 LOTRepeaterData *mData;
494 #endif // LOTTIEITEM_H