lottie/example: updated example to use async rendering . 56/184656/2
authorsubhransu mohanty <sub.mohanty@samsung.com>
Fri, 20 Jul 2018 01:30:03 +0000 (10:30 +0900)
committerHermet Park <chuneon.park@samsung.com>
Fri, 20 Jul 2018 05:45:18 +0000 (05:45 +0000)
Change-Id: I6929f00bb6a26f18f7276890c40993329d94ae03

example/lottieview.cpp
example/lottieview.h
example/lottieviewtest.cpp

index 489dcfd..a59468d 100644 (file)
@@ -105,6 +105,9 @@ LottieView::LottieView(Evas *evas, bool renderMode, bool asyncRender):mVg(nullpt
 
 LottieView::~LottieView()
 {
+    if (mRenderTask.valid())
+        mRenderTask.get();
+
     ecore_animator_del(mAnimator);
     if (mVg) evas_object_del(mVg);
     if (mImage) evas_object_del(mImage);
@@ -139,8 +142,13 @@ void LottieView::seek(float pos)
         LOTBuffer buf;
         evas_object_image_size_get(mImage, &buf.width, &buf.height);
         if (mAsyncRender) {
+            if (mRenderTask.valid()) return;
             mDirty = true;
             mPendingPos = pos;
+            buf.buffer = (uint32_t *)evas_object_image_data_get(mImage, EINA_TRUE);
+            buf.bytesPerLine =  evas_object_image_stride_get(mImage);
+            mRenderTask = mPlayer->render(mPendingPos, buf);
+            mBuffer = buf;
             // to force a redraw
             evas_object_image_data_update_add(mImage, 0 , 0, buf.width, buf.height);
         } else {
@@ -166,16 +174,17 @@ void LottieView::render()
     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(mPendingPos, buf);
-        evas_object_image_data_set(mImage, buf.buffer);
+        if (!mBuffer.buffer) return;
+        bool changed = false;
+        if (mRenderTask.valid()) {
+            changed = mRenderTask.get();
+        }
+        evas_object_image_data_set(mImage, mBuffer.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);
+            evas_object_image_data_update_add(mImage, 0 , 0, mBuffer.width, mBuffer.height);
         }
+        mBuffer.buffer = nullptr;
     } else {
         mPlayer->setPos(mPendingPos);
         const std::vector<LOTNode *> &renderList = mPlayer->renderList();
index 4a31ff7..846610a 100644 (file)
@@ -15,7 +15,7 @@
 #include <Ecore.h>
 #include <Ecore_Evas.h>
 #include"lottieplayer.h"
-
+#include<future>
 class LOTPlayer;
 class LottieView
 {
@@ -66,5 +66,7 @@ public:
     bool                     mAsyncRender;
     bool                     mDirty;
     float                    mPendingPos;
+    std::future<bool>        mRenderTask;
+    LOTBuffer                mBuffer;
 };
 #endif //LOTTIEVIEW_H
index 59a3cf7..838b9c8 100644 (file)
@@ -56,9 +56,12 @@ public:
   }
 
   void render() {
+      //auto clock = std::chrono::high_resolution_clock::now();
       for (auto &i : mViews) {
           i->render();
       }
+      //double d = std::chrono::duration<double, std::milli>(std::chrono::high_resolution_clock::now()-clock).count();
+      //printf("total time taken = %f\n", d);
   }
 
 public:
@@ -93,7 +96,7 @@ main(int argc, char **argv)
            renderMode = false;
    }
    LottieViewTest *view = new LottieViewTest(app, renderMode);
-   view->show(50);
+   view->show(400);
 
    app->addExitCb(onExitCb, view);
    app->addRenderPreCb(onRenderPreCb, view);