3 using namespace lottieplayer;
6 animator(void *data , double pos)
8 LottieView *view = static_cast<LottieView *>(data);
17 void LottieView::createVgNode(LOTNode *node, Efl_VG *parent)
19 Efl_VG *shape = evas_vg_shape_add(parent);
21 const float *data = node->mPath.ptPtr;
22 for(int i=0; i <node->mPath.elmCount; i++) {
23 switch (node->mPath.elmPtr[i]) {
26 evas_vg_shape_append_move_to(shape, data[0], data[1]);
32 evas_vg_shape_append_line_to(shape, data[0], data[1]);
38 evas_vg_shape_append_cubic_to(shape, data[0], data[1], data[2], data[3], data[4], data[5]);
44 evas_vg_shape_append_close(shape);
52 if (node->mStroke.enable) {
53 evas_vg_shape_stroke_width_set(shape, node->mStroke.width);
54 //evas_vg_shape_stroke_cap_set(shape, int(node->mStroke.cap));
55 //evas_vg_shape_stroke_join_set(shape, int(node->mStroke.join));
56 //evas_vg_shape_stroke_meter_limit_set(shape, node->mStroke.meterLimit);
59 if (node->mType == LOTBrushType::BrushSolid) {
60 int r = (node->mColor.r * node->mColor.a)/255;
61 int g = (node->mColor.g * node->mColor.a)/255;
62 int b = (node->mColor.b * node->mColor.a)/255;
63 int a = node->mColor.a;
64 if (node->mStroke.enable) {
65 evas_vg_shape_stroke_color_set(shape, r, g, b, a);
67 evas_vg_node_color_set(shape, r, g, b, a);
70 } else if (node->mType == LOTBrushType::BrushGradient) {
71 //TODO fill the gradient info
75 void LottieView::update(const std::vector<LOTNode *> &renderList)
77 Efl_VG *root = evas_vg_container_add(mVg);
78 for(auto i : renderList) {
79 createVgNode(i, root);
81 evas_object_vg_root_node_set(mVg, root);
84 LottieView::LottieView(Evas *evas, bool renderMode, bool asyncRender):mVg(nullptr), mImage(nullptr)
89 mRepeatMode = LottieView::RepeatMode::Restart;
94 mPlayer = new LOTPlayer();
95 mRenderMode = renderMode;
96 mAsyncRender = asyncRender;
99 mImage = evas_object_image_filled_add(evas);
100 evas_object_image_colorspace_set(mImage, EVAS_COLORSPACE_ARGB8888);
101 evas_object_image_alpha_set(mImage, EINA_TRUE);
103 mVg = evas_object_vg_add(evas);
107 LottieView::~LottieView()
109 if (mRenderTask.valid())
112 if (mAnimator) ecore_animator_del(mAnimator);
113 if (mVg) evas_object_del(mVg);
114 if (mImage) evas_object_del(mImage);
118 void LottieView::show()
121 evas_object_show(mImage);
123 evas_object_show(mVg);
128 void LottieView::hide()
131 evas_object_hide(mImage);
133 evas_object_hide(mVg);
137 void LottieView::seek(float pos)
139 if (mPalying && mReverse)
144 evas_object_image_size_get(mImage, &buf.width, &buf.height);
146 if (mRenderTask.valid()) return;
149 buf.buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE);
150 buf.bytesPerLine = evas_object_image_stride_get(mImage);
151 mRenderTask = mPlayer->render(mPendingPos, buf);
154 evas_object_image_data_update_add(mImage, 0 , 0, buf.width, buf.height);
156 buf.buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE);
157 buf.bytesPerLine = evas_object_image_stride_get(mImage);
158 bool changed = mPlayer->renderSync(pos, buf);
159 evas_object_image_data_set(mImage, buf.buffer);
160 // if the buffer is updated notify the image object
162 evas_object_image_data_update_add(mImage, 0 , 0, buf.width, buf.height);
166 const std::vector<LOTNode *> &renderList = mPlayer->renderList(pos);
171 void LottieView::render()
177 if (!mBuffer.buffer) return;
178 bool changed = false;
179 if (mRenderTask.valid()) {
180 changed = mRenderTask.get();
182 evas_object_image_data_set(mImage, mBuffer.buffer);
183 // if the buffer is updated notify the image object
185 evas_object_image_data_update_add(mImage, 0 , 0, mBuffer.width, mBuffer.height);
187 mBuffer.buffer = nullptr;
189 const std::vector<LOTNode *> &renderList = mPlayer->renderList(mPendingPos);
194 void LottieView::setFilePath(const char *filePath)
196 mPlayer->setFilePath(filePath);
197 mFrameRate = mPlayer->getFrameRate();
198 mTotalFrame = mPlayer->getTotalFrame();
201 void LottieView::setSize(int w, int h)
204 evas_object_resize(mImage, w, h);
205 evas_object_image_size_set(mImage, w, h);
207 evas_object_resize(mVg, w, h);
209 mPlayer->setSize(w, h);
211 void LottieView::setPos(int x, int y)
214 evas_object_move(mImage, x, y);
216 evas_object_move(mVg, x, y);
220 void LottieView::finished()
225 void LottieView::loop(bool loop)
230 void LottieView::setRepeatCount(int count)
232 mRepeatCount = count;
235 void LottieView::setRepeatMode(LottieView::RepeatMode mode)
240 void LottieView::play()
242 mAnimator = ecore_animator_timeline_add(mPlayer->playTime()/mSpeed, animator, this);
244 mCurCount = mRepeatCount;
248 void LottieView::pause()
253 void LottieView::stop()
258 void LottieView::restart()
261 if (mLoop || mRepeatCount) {
262 if (mRepeatMode == LottieView::RepeatMode::Reverse)
263 mReverse = !mReverse;
266 mAnimator = ecore_animator_timeline_add(mPlayer->playTime()/mSpeed, animator, this);