From: subhransu mohanty Date: Thu, 19 Jul 2018 00:13:13 +0000 (+0900) Subject: lottie/example: delay rendering of view till pre render callback to mimic the evas... X-Git-Tag: submit/tizen/20180917.042405~229 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3aff15cf424833765023703688a5105e94032456;p=platform%2Fcore%2Fuifw%2Flottie-player.git lottie/example: delay rendering of view till pre render callback to mimic the evas rendering pipeline. Change-Id: I1d7711feda273f9e69712e2bb37c672f76e68515 --- diff --git a/example/demo.cpp b/example/demo.cpp index e56e395..4bd2b8e 100644 --- a/example/demo.cpp +++ b/example/demo.cpp @@ -11,6 +11,13 @@ onExitCb(void *data, void *extra) delete view; } +static void +onRenderPreCb(void *data, void *extra) +{ + LottieView *view = (LottieView *)data; + view->render(); +} + int main(void) { @@ -30,6 +37,7 @@ main(void) view->setRepeatMode(LottieView::RepeatMode::Reverse); app->addExitCb(onExitCb, view); + app->addRenderPreCb(onRenderPreCb, view); app->run(); delete app; return 0; diff --git a/example/evasapp.cpp b/example/evasapp.cpp index 2a1552f..3ce33cb 100644 --- a/example/evasapp.cpp +++ b/example/evasapp.cpp @@ -35,6 +35,14 @@ on_key_down(void *data, int type, void *event) 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()) @@ -53,6 +61,7 @@ EvasApp::setup() 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); diff --git a/example/evasapp.h b/example/evasapp.h index 9ae027e..18c6cb4 100644 --- a/example/evasapp.h +++ b/example/evasapp.h @@ -35,6 +35,7 @@ public: 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 jsonFiles(const std::string &dir, bool recurse=false); public: int mw; @@ -50,5 +51,7 @@ public: void *mExitData; appCb mKeyCb; void *mKeyData; + appCb mRenderPreCb; + void *mRenderPreData; }; #endif //EVASAPP_H diff --git a/example/lottieview.cpp b/example/lottieview.cpp index 075ff3b..489dcfd 100644 --- a/example/lottieview.cpp +++ b/example/lottieview.cpp @@ -80,7 +80,7 @@ void LottieView::update(const std::vector &renderList) 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; @@ -92,6 +92,7 @@ LottieView::LottieView(Evas *evas, bool renderMode):mVg(nullptr), mImage(nullptr mEvas = evas; mPlayer = new LOTPlayer(); mRenderMode = renderMode; + mAsyncRender = asyncRender; if (mRenderMode) { mImage = evas_object_image_filled_add(evas); @@ -134,19 +135,49 @@ void LottieView::seek(float pos) if (mPalying && mReverse) pos = 1.0 - pos; + 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 &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 &renderList = mPlayer->renderList(); update(renderList); } diff --git a/example/lottieview.h b/example/lottieview.h index 59ea019..4a31ff7 100644 --- a/example/lottieview.h +++ b/example/lottieview.h @@ -24,7 +24,7 @@ public: 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); @@ -41,6 +41,7 @@ public: void play(); void pause(); void stop(); + void render(); private: void createVgNode(LOTNode *node, Efl_VG *parent); void update(const std::vector &); @@ -62,5 +63,8 @@ public: Evas_Object *mImage; float mSpeed; bool mRenderMode; + bool mAsyncRender; + bool mDirty; + float mPendingPos; }; #endif //LOTTIEVIEW_H diff --git a/example/lottieviewtest.cpp b/example/lottieviewtest.cpp index 6c27f40..7af573e 100644 --- a/example/lottieviewtest.cpp +++ b/example/lottieviewtest.cpp @@ -55,6 +55,12 @@ public: } + void render() { + for (auto &i : mViews) { + i->render(); + } + } + public: EvasApp *mApp; bool mRenderMode = false; @@ -68,6 +74,13 @@ onExitCb(void *data, void *extra) delete view; } +static void +onRenderPreCb(void *data, void *extra) +{ + LottieViewTest *view = (LottieViewTest *)data; + view->render(); +} + int main(int argc, char **argv) { @@ -83,6 +96,7 @@ main(int argc, char **argv) view->show(); app->addExitCb(onExitCb, view); + app->addRenderPreCb(onRenderPreCb, view); app->run(); delete app; diff --git a/example/uxsampletest.cpp b/example/uxsampletest.cpp index 03fe211..317c147 100644 --- a/example/uxsampletest.cpp +++ b/example/uxsampletest.cpp @@ -78,6 +78,14 @@ onKeyCb(void *data, void *extra) } } +static void +onRenderPreCb(void *data, void *extra) +{ + UxSampleTest *view = (UxSampleTest *)data; + if (view->mView) + view->mView->render(); +} + int main(int argc, char **argv) { @@ -94,6 +102,7 @@ main(int argc, char **argv) app->addExitCb(onExitCb, view); app->addKeyCb(onKeyCb, view); + app->addRenderPreCb(onRenderPreCb, view); app->run(); delete app;