lottie/example: delay rendering of view till pre render callback to mimic the evas... 58/184558/2
authorsubhransu mohanty <sub.mohanty@samsung.com>
Thu, 19 Jul 2018 00:13:13 +0000 (09:13 +0900)
committerHermet Park <chuneon.park@samsung.com>
Thu, 19 Jul 2018 03:52:29 +0000 (03:52 +0000)
Change-Id: I1d7711feda273f9e69712e2bb37c672f76e68515

example/demo.cpp
example/evasapp.cpp
example/evasapp.h
example/lottieview.cpp
example/lottieview.h
example/lottieviewtest.cpp
example/uxsampletest.cpp

index e56e395..4bd2b8e 100644 (file)
@@ -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;
index 2a1552f..3ce33cb 100644 (file)
@@ -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);
index 9ae027e..18c6cb4 100644 (file)
@@ -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<std::string> 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
index 075ff3b..489dcfd 100644 (file)
@@ -80,7 +80,7 @@ void LottieView::update(const std::vector<LOTNode *> &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);
@@ -136,17 +137,47 @@ void LottieView::seek(float 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<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);
     }
index 59ea019..4a31ff7 100644 (file)
@@ -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<LOTNode *> &);
@@ -62,5 +63,8 @@ public:
     Evas_Object             *mImage;
     float                    mSpeed;
     bool                     mRenderMode;
+    bool                     mAsyncRender;
+    bool                     mDirty;
+    float                    mPendingPos;
 };
 #endif //LOTTIEVIEW_H
index 6c27f40..7af573e 100644 (file)
@@ -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;
index 03fe211..317c147 100644 (file)
@@ -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;