3 using namespace lottieplayer;
6 animator(void *data , double pos)
8 LottieView *view = static_cast<LottieView *>(data);
9 float nextPos = pos + view->mStartPos;
10 if (nextPos > 1.0) nextPos = 1.0;
14 view->mAnimator = NULL;
21 void LottieView::createVgNode(LOTNode *node, Efl_VG *parent)
23 Efl_VG *shape = evas_vg_shape_add(parent);
25 const float *data = node->mPath.ptPtr;
26 for(int i=0; i <node->mPath.elmCount; i++) {
27 switch (node->mPath.elmPtr[i]) {
30 evas_vg_shape_append_move_to(shape, data[0], data[1]);
36 evas_vg_shape_append_line_to(shape, data[0], data[1]);
42 evas_vg_shape_append_cubic_to(shape, data[0], data[1], data[2], data[3], data[4], data[5]);
48 evas_vg_shape_append_close(shape);
56 if (node->mStroke.enable) {
57 evas_vg_shape_stroke_width_set(shape, node->mStroke.width);
58 //evas_vg_shape_stroke_cap_set(shape, int(node->mStroke.cap));
59 //evas_vg_shape_stroke_join_set(shape, int(node->mStroke.join));
60 //evas_vg_shape_stroke_meter_limit_set(shape, node->mStroke.meterLimit);
63 if (node->mType == LOTBrushType::BrushSolid) {
64 int r = (node->mColor.r * node->mColor.a)/255;
65 int g = (node->mColor.g * node->mColor.a)/255;
66 int b = (node->mColor.b * node->mColor.a)/255;
67 int a = node->mColor.a;
68 if (node->mStroke.enable) {
69 evas_vg_shape_stroke_color_set(shape, r, g, b, a);
71 evas_vg_node_color_set(shape, r, g, b, a);
74 } else if (node->mType == LOTBrushType::BrushGradient) {
75 //TODO fill the gradient info
79 void LottieView::update(const std::vector<LOTNode *> &renderList)
81 Efl_VG *root = evas_vg_container_add(mVg);
82 for(auto i : renderList) {
83 createVgNode(i, root);
85 evas_object_vg_root_node_set(mVg, root);
88 static void mImageDelCb(void *data, Evas *evas, Evas_Object *obj, void *)
90 LottieView *lottie = (LottieView *)data;
92 if (lottie->mImage != obj) return;
94 lottie->mImage = NULL;
98 static void mVgDelCb(void *data, Evas *evas, Evas_Object *obj, void *)
100 LottieView *lottie = (LottieView *)data;
101 if (lottie->mVg != obj) return;
107 void LottieView::initializeBufferObject(Evas *evas)
110 mImage = evas_object_image_filled_add(evas);
111 evas_object_image_colorspace_set(mImage, EVAS_COLORSPACE_ARGB8888);
112 evas_object_image_alpha_set(mImage, EINA_TRUE);
113 evas_object_event_callback_add(mImage, EVAS_CALLBACK_DEL, mImageDelCb, this);
115 mVg = evas_object_vg_add(evas);
116 evas_object_event_callback_add(mVg, EVAS_CALLBACK_DEL, mVgDelCb, this);
120 LottieView::LottieView(Evas *evas, bool renderMode, bool asyncRender):mVg(nullptr), mImage(nullptr)
125 mRepeatMode = LottieView::RepeatMode::Restart;
130 mPlayer = new LOTPlayer();
131 mRenderMode = renderMode;
132 mAsyncRender = asyncRender;
134 initializeBufferObject(evas);
137 LottieView::~LottieView()
139 if (mRenderTask.valid())
142 if (mAnimator) ecore_animator_del(mAnimator);
143 if (mVg) evas_object_del(mVg);
144 if (mImage) evas_object_del(mImage);
148 Evas_Object *LottieView::getImage() {
156 void LottieView::show()
159 evas_object_show(mImage);
161 evas_object_show(mVg);
166 void LottieView::hide()
169 evas_object_hide(mImage);
171 evas_object_hide(mVg);
175 void LottieView::seek(float pos)
177 if (mPalying && mReverse)
184 evas_object_image_size_get(mImage, &buf.width, &buf.height);
186 if (mRenderTask.valid()) return;
188 buf.buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE);
189 buf.bytesPerLine = evas_object_image_stride_get(mImage);
190 mRenderTask = mPlayer->render(mPos, buf);
193 evas_object_image_data_update_add(mImage, 0 , 0, buf.width, buf.height);
195 buf.buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE);
196 buf.bytesPerLine = evas_object_image_stride_get(mImage);
197 bool changed = mPlayer->renderSync(pos, buf);
198 evas_object_image_data_set(mImage, buf.buffer);
199 // if the buffer is updated notify the image object
201 evas_object_image_data_update_add(mImage, 0 , 0, buf.width, buf.height);
205 const std::vector<LOTNode *> &renderList = mPlayer->renderList(pos);
210 float LottieView::getPos()
215 void LottieView::render()
221 if (!mBuffer.buffer) return;
222 bool changed = false;
223 if (mRenderTask.valid()) {
224 changed = mRenderTask.get();
226 evas_object_image_data_set(mImage, mBuffer.buffer);
227 // if the buffer is updated notify the image object
229 evas_object_image_data_update_add(mImage, 0 , 0, mBuffer.width, mBuffer.height);
231 mBuffer.buffer = nullptr;
233 const std::vector<LOTNode *> &renderList = mPlayer->renderList(mPos);
238 void LottieView::setFilePath(const char *filePath)
240 mPlayer->setFilePath(filePath);
241 mFrameRate = mPlayer->getFrameRate();
242 mTotalFrame = mPlayer->getTotalFrame();
245 void LottieView::setSize(int w, int h)
248 evas_object_resize(mImage, w, h);
249 evas_object_image_size_set(mImage, w, h);
251 evas_object_resize(mVg, w, h);
253 mPlayer->setSize(w, h);
255 void LottieView::setPos(int x, int y)
258 evas_object_move(mImage, x, y);
260 evas_object_move(mVg, x, y);
264 void LottieView::finished()
269 void LottieView::loop(bool loop)
274 void LottieView::setRepeatCount(int count)
276 mRepeatCount = count;
279 void LottieView::setRepeatMode(LottieView::RepeatMode mode)
284 void LottieView::play()
287 if (mAnimator) ecore_animator_del(mAnimator);
288 mAnimator = ecore_animator_timeline_add(mPlayer->playTime()/mSpeed, animator, this);
290 mCurCount = mRepeatCount;
294 void LottieView::pause()
299 void LottieView::stop()
303 ecore_animator_del(mAnimator);
308 void LottieView::restart()
311 if (mLoop || mRepeatCount) {
312 if (mRepeatMode == LottieView::RepeatMode::Reverse)
313 mReverse = !mReverse;
318 if (mAnimator) ecore_animator_del(mAnimator);
319 mAnimator = ecore_animator_timeline_add(mPlayer->playTime()/mSpeed, animator, this);