delete view;
}
+static void
+onRenderPreCb(void *data, void *extra)
+{
+ LottieView *view = (LottieView *)data;
+ view->render();
+}
+
int
main(void)
{
view->setRepeatMode(LottieView::RepeatMode::Reverse);
app->addExitCb(onExitCb, view);
+ app->addRenderPreCb(onRenderPreCb, view);
app->run();
delete app;
return 0;
return false;
}
+static void
+on_pre_render(Ecore_Evas *ee)
+{
+ EvasApp *app = (EvasApp *)ecore_evas_data_get(ee, "app");
+ if (app->mRenderPreCb)
+ app->mRenderPreCb(app->mRenderPreData, nullptr);
+}
+
EvasApp::EvasApp(int w, int h)
{
if (!ecore_evas_init())
ecore_evas_callback_resize_set(mEcoreEvas, _on_resize);
ecore_evas_callback_delete_request_set(mEcoreEvas, _on_delete);
ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, on_key_down, this);
+ ecore_evas_callback_pre_render_set(mEcoreEvas, on_pre_render);
ecore_evas_show(mEcoreEvas);
mEvas = ecore_evas_get(mEcoreEvas);
void addExitCb(appCb exitcb, void *data) {mExitCb = exitcb; mExitData = data;}
void addResizeCb(appCb resizecb, void *data) {mResizeCb = resizecb; mResizeData = data;}
void addKeyCb(appCb keycb, void *data) {mKeyCb = keycb; mKeyData = data;}
+ void addRenderPreCb(appCb renderPrecb, void *data) {mRenderPreCb = renderPrecb; mRenderPreData = data;}
static std::vector<std::string> jsonFiles(const std::string &dir, bool recurse=false);
public:
int mw;
void *mExitData;
appCb mKeyCb;
void *mKeyData;
+ appCb mRenderPreCb;
+ void *mRenderPreData;
};
#endif //EVASAPP_H
evas_object_vg_root_node_set(mVg, root);
}
-LottieView::LottieView(Evas *evas, bool renderMode):mVg(nullptr), mImage(nullptr)
+LottieView::LottieView(Evas *evas, bool renderMode, bool asyncRender):mVg(nullptr), mImage(nullptr)
{
mPalying = false;
mReverse = false;
mEvas = evas;
mPlayer = new LOTPlayer();
mRenderMode = renderMode;
+ mAsyncRender = asyncRender;
if (mRenderMode) {
mImage = evas_object_image_filled_add(evas);
if (mRenderMode) {
LOTBuffer buf;
+ evas_object_image_size_get(mImage, &buf.width, &buf.height);
+ if (mAsyncRender) {
+ mDirty = true;
+ mPendingPos = pos;
+ // to force a redraw
+ evas_object_image_data_update_add(mImage, 0 , 0, buf.width, buf.height);
+ } else {
+ buf.buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE);
+ buf.bytesPerLine = evas_object_image_stride_get(mImage);
+ bool changed = mPlayer->renderSync(pos, buf);
+ evas_object_image_data_set(mImage, buf.buffer);
+ // if the buffer is updated notify the image object
+ if (changed) {
+ evas_object_image_data_update_add(mImage, 0 , 0, buf.width, buf.height);
+ }
+ }
+ } else {
+ mPlayer->setPos(pos);
+ const std::vector<LOTNode *> &renderList = mPlayer->renderList();
+ update(renderList);
+ }
+}
+
+void LottieView::render()
+{
+ if (!mDirty) return;
+ mDirty = false;
+
+ if (mRenderMode) {
+ LOTBuffer buf;
buf.buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE);
buf.bytesPerLine = evas_object_image_stride_get(mImage);
evas_object_image_size_get(mImage, &buf.width, &buf.height);
- bool changed = mPlayer->renderSync(pos, buf);
+ bool changed = mPlayer->renderSync(mPendingPos, buf);
evas_object_image_data_set(mImage, buf.buffer);
// if the buffer is updated notify the image object
if (changed) {
evas_object_image_data_update_add(mImage, 0 , 0, buf.width, buf.height);
}
} else {
- mPlayer->setPos(pos);
+ mPlayer->setPos(mPendingPos);
const std::vector<LOTNode *> &renderList = mPlayer->renderList();
update(renderList);
}
Restart,
Reverse
};
- LottieView(Evas *evas, bool renderMode = true);
+ LottieView(Evas *evas, bool renderMode = true, bool asyncRender = true);
~LottieView();
void setSize(int w, int h);
void setPos(int x, int y);
void play();
void pause();
void stop();
+ void render();
private:
void createVgNode(LOTNode *node, Efl_VG *parent);
void update(const std::vector<LOTNode *> &);
Evas_Object *mImage;
float mSpeed;
bool mRenderMode;
+ bool mAsyncRender;
+ bool mDirty;
+ float mPendingPos;
};
#endif //LOTTIEVIEW_H
}
+ void render() {
+ for (auto &i : mViews) {
+ i->render();
+ }
+ }
+
public:
EvasApp *mApp;
bool mRenderMode = false;
delete view;
}
+static void
+onRenderPreCb(void *data, void *extra)
+{
+ LottieViewTest *view = (LottieViewTest *)data;
+ view->render();
+}
+
int
main(int argc, char **argv)
{
view->show();
app->addExitCb(onExitCb, view);
+ app->addRenderPreCb(onRenderPreCb, view);
app->run();
delete app;
}
}
+static void
+onRenderPreCb(void *data, void *extra)
+{
+ UxSampleTest *view = (UxSampleTest *)data;
+ if (view->mView)
+ view->mView->render();
+}
+
int
main(int argc, char **argv)
{
app->addExitCb(onExitCb, view);
app->addKeyCb(onKeyCb, view);
+ app->addRenderPreCb(onRenderPreCb, view);
app->run();
delete app;