rlottie/example: refactor to use evas_object_image_pixels_dirty_set() api
authorsubhransu mohanty <sub.mohanty@samsung.com>
Tue, 4 Jun 2019 04:58:32 +0000 (13:58 +0900)
committerHermet Park <hermetpark@gmail.com>
Wed, 19 Jun 2019 04:35:27 +0000 (13:35 +0900)
example/demo.cpp
example/lottieview.cpp
example/lottieview.h
example/lottieviewer.cpp
example/lottieviewtest.cpp
example/uxsampletest.cpp

index a61aef9..3509362 100644 (file)
@@ -31,13 +31,6 @@ onExitCb(void *data, void */*extra*/)
     delete view;
 }
 
-static void
-onRenderPreCb(void *data, void */*extra*/)
-{
-    LottieView *view = (LottieView *)data;
-    view->render();
-}
-
 int
 main(void)
 {
@@ -69,7 +62,6 @@ main(void)
    view->setRepeatMode(LottieView::RepeatMode::Reverse);
 
    app->addExitCb(onExitCb, view);
-   app->addRenderPreCb(onRenderPreCb, view);
    app->run();
    delete app;
    return 0;
index 755b2e0..8659c16 100644 (file)
 
 using namespace rlottie;
 
+static void
+_image_update_cb(void *data, Evas_Object *obj EINA_UNUSED)
+{
+   RenderStrategy *info = (RenderStrategy *)data;
+   info->dataCb();
+}
+
+void RenderStrategy::addCallback(){
+    evas_object_image_pixels_get_callback_set(_renderObject, _image_update_cb, this);
+}
+
 static Eina_Bool
 animator(void *data , double pos)
 {
@@ -101,7 +112,7 @@ void LottieView::seek(float pos)
 
     mCurFrame = mRenderDelegate->frameAtPos(mPos);
 
-    mRenderDelegate->renderRequest(mCurFrame);
+    mRenderDelegate->render(mCurFrame);
 }
 
 float LottieView::getPos()
@@ -109,11 +120,6 @@ float LottieView::getPos()
    return mPos;
 }
 
-void LottieView::render()
-{
-    mRenderDelegate->renderFlush();
-}
-
 void LottieView::setFilePath(const char *filePath)
 {
     mRenderDelegate->loadFromFile(filePath);
index 0874e97..34c414f 100644 (file)
@@ -42,7 +42,9 @@ public:
     virtual ~RenderStrategy() {
         evas_object_del(renderObject());
     }
-    RenderStrategy(Evas_Object *obj):_renderObject(obj){}
+    RenderStrategy(Evas_Object *obj):_renderObject(obj){
+        addCallback();
+    }
     virtual rlottie::Animation *player() {return nullptr;}
     virtual void loadFromFile(const char *filePath) = 0;
     virtual void loadFromData(const std::string &jsonData, const std::string &key, const std::string &resourcePath) = 0;
@@ -50,14 +52,28 @@ public:
     virtual double frameRate() = 0;
     virtual size_t frameAtPos(double pos) = 0;
     virtual double duration() = 0;
-    virtual void renderRequest(int frame) = 0;
-    virtual void renderFlush() {}
+    void render(int frame) {
+        _redraw = renderRequest(frame);
+        if (_redraw)
+            evas_object_image_pixels_dirty_set(renderObject(), EINA_TRUE);
+    }
+    void dataCb() {
+        if (_redraw) {
+            evas_object_image_data_set(renderObject(), buffer());
+        }
+        _redraw = false;
+    }
     virtual void resize(int width, int height) = 0;
     virtual void setPos(int x, int y) {evas_object_move(renderObject(), x, y);}
     void show() {evas_object_show(_renderObject);}
     void hide() {evas_object_hide(_renderObject);}
+    void addCallback();
     Evas_Object* renderObject() const {return _renderObject;}
+protected:
+    virtual bool renderRequest(int) = 0;
+    virtual uint32_t* buffer() = 0;
 private:
+    bool         _redraw{false};
     Evas_Object *_renderObject;
 };
 
@@ -129,29 +145,34 @@ class RlottieRenderStrategy_CPP : public RlottieRenderStrategy {
 public:
     RlottieRenderStrategy_CPP(Evas *evas):RlottieRenderStrategy(evas) {}
 
-    void renderRequest(int frame) {
+    bool renderRequest(int frame) {
         int width , height;
         Evas_Object *image = renderObject();
         evas_object_image_size_get(image, &width, &height);
-        auto buffer = (uint32_t *)evas_object_image_data_get(image, EINA_TRUE);
+        mBuffer = (uint32_t *)evas_object_image_data_get(image, EINA_TRUE);
         size_t bytesperline =  evas_object_image_stride_get(image);
-        rlottie::Surface surface(buffer, width, height, bytesperline);
+        rlottie::Surface surface(mBuffer, width, height, bytesperline);
         mPlayer->renderSync(frame, surface);
-        evas_object_image_data_set(image, surface.buffer());
-        evas_object_image_data_update_add(image, 0 , 0, surface.width(), surface.height());
+        return true;
+    }
+    uint32_t* buffer() {
+        return mBuffer;
     }
+
+private:
+    uint32_t *              mBuffer;
 };
 
-class RlottieRenderStrategy_CPP_ASYNC : public RlottieRenderStrategy_CPP {
+class RlottieRenderStrategy_CPP_ASYNC : public RlottieRenderStrategy {
 public:
-    RlottieRenderStrategy_CPP_ASYNC(Evas *evas):RlottieRenderStrategy_CPP(evas) {}
+    RlottieRenderStrategy_CPP_ASYNC(Evas *evas):RlottieRenderStrategy(evas) {}
     ~RlottieRenderStrategy_CPP_ASYNC() {
         if (mRenderTask.valid())
             mRenderTask.get();
     }
-    void renderRequest(int frame) {
-        if (mRenderTask.valid()) return;
-        mDirty = true;
+    bool renderRequest(int frame) {
+        //addCallback();
+        if (mRenderTask.valid()) return true;
         int width , height;
         Evas_Object *image = renderObject();
         evas_object_image_size_get(image, &width, &height);
@@ -159,23 +180,15 @@ public:
         size_t bytesperline =  evas_object_image_stride_get(image);
         rlottie::Surface surface(buffer, width, height, bytesperline);
         mRenderTask = mPlayer->render(frame, surface);
-        // to force a redraw
-        evas_object_image_data_update_add(renderObject(), 0 , 0, surface.width(), surface.height());
+        return true;
     }
 
-    void renderFlush() {
-        if (!mDirty) return;
-
-        if (!mRenderTask.valid()) return;
-
+    uint32_t* buffer() {
         auto surface = mRenderTask.get();
-        evas_object_image_data_set(renderObject(), surface.buffer());
-        evas_object_image_data_update_add(renderObject(), 0 , 0, surface.width(), surface.height());
-        mDirty = false;
+        return surface.buffer();
     }
 private:
    std::future<rlottie::Surface>        mRenderTask;
-   bool                                 mDirty{true};
 };
 
 
@@ -219,18 +232,22 @@ public:
         return lottie_animation_get_duration(mPlayer);
     }
 
-    void renderRequest(int frame) {
+    bool renderRequest(int frame) {
         int width , height;
         Evas_Object *image = renderObject();
         evas_object_image_size_get(image, &width, &height);
-        auto buffer = (uint32_t *)evas_object_image_data_get(image, EINA_TRUE);
+        mBuffer = (uint32_t *)evas_object_image_data_get(image, EINA_TRUE);
         size_t bytesperline =  evas_object_image_stride_get(image);
-        lottie_animation_render_async(mPlayer, frame, buffer, width, height, bytesperline);
-        lottie_animation_render_flush(mPlayer);
-        evas_object_image_data_set(image, buffer);
-        evas_object_image_data_update_add(image, 0 , 0, width, height);
+        lottie_animation_render(mPlayer, frame, mBuffer, width, height, bytesperline);
+        return true;
+    }
+
+    uint32_t* buffer() {
+        return mBuffer;
     }
 
+private:
+    uint32_t *              mBuffer;
 protected:
    Lottie_Animation       *mPlayer;
 };
@@ -241,25 +258,23 @@ public:
     ~RlottieRenderStrategy_C_ASYNC() {
         if (mDirty) lottie_animation_render_flush(mPlayer);
     }
-    void renderRequest(int frame) {
-        if (mDirty) return;
+    bool renderRequest(int frame) {
+        if (mDirty) return true;
         mDirty = true;
         Evas_Object *image = renderObject();
         evas_object_image_size_get(image, &mWidth, &mHeight);
         mBuffer = (uint32_t *)evas_object_image_data_get(image, EINA_TRUE);
         size_t bytesperline =  evas_object_image_stride_get(image);
         lottie_animation_render_async(mPlayer, frame, mBuffer, mWidth, mHeight, bytesperline);
-        // to force a redraw
-        evas_object_image_data_update_add(renderObject(), 0 , 0, mWidth, mWidth);
+        return true;
     }
 
-    void renderFlush() {
-        if (!mDirty) return;
-        lottie_animation_render_flush(mPlayer);
-        evas_object_image_data_set(renderObject(), mBuffer);
-        evas_object_image_data_update_add(renderObject(), 0 , 0, mWidth, mHeight);
-        mDirty = false;
+    uint32_t* buffer() {
+       lottie_animation_render_flush(mPlayer);
+       mDirty =false;
+       return mBuffer;
     }
+
 private:
    uint32_t *              mBuffer;
    int                     mWidth;
@@ -305,7 +320,6 @@ public:
     void play();
     void pause();
     void stop();
-    void render();
     void initializeBufferObject(Evas *evas);
     void setMinProgress(float progress)
     {
@@ -357,7 +371,7 @@ public:
     std::unique_ptr<RenderStrategy>  mRenderDelegate;
 };
 
-
+#include<assert.h>
 class EflVgRenderStrategy : public CppApiBase {
     int mW;
     int mH;
@@ -370,9 +384,14 @@ public:
         evas_object_resize(renderObject(), width, height);
     }
 
-    void renderRequest(int frame) {
+    uint32_t *buffer() {
+        assert(false);
+    }
+
+    bool renderRequest(int frame) {
         const LOTLayerNode *root = mPlayer->renderTree(frame, mW, mH);
         updateTree(root);
+        return false;
     }
 
     void updateTree(const LOTLayerNode * node)
index 1439d4a..75921b1 100644 (file)
@@ -124,13 +124,6 @@ _button_clicked_cb(void *data, Evas_Object */*obj*/, void */*event_info*/)
    _toggle_start_button(info);
 }
 
-static void
-_image_update_cb(void *data, Evas_Object *obj EINA_UNUSED)
-{
-   AppInfo *info = (AppInfo *)data;
-   info->view->render();
-}
-
 Evas_Object *
 create_layout(Evas_Object *parent, const char *file)
 {
@@ -157,7 +150,6 @@ create_layout(Evas_Object *parent, const char *file)
    //IMAGE from LOTTIEVIEW
    image = view->getImage();
    evas_object_show(image);
-   evas_object_image_pixels_get_callback_set(image, _image_update_cb, info);
    elm_object_part_content_set(layout, "lottie", image);
 
    //SLIDER
@@ -183,8 +175,6 @@ create_layout(Evas_Object *parent, const char *file)
    elm_object_part_text_set(layout, "text", buf);
 
    view->seek(0.0);
-   view->render();
-
    return layout;
 }
 
index c7f8043..57cbc71 100644 (file)
@@ -63,7 +63,6 @@ public:
         view->play();
         view->loop(true);
         //view->setRepeatMode(LottieView::RepeatMode::Reverse);
-
         posx += vw+offset;
         if ((mApp->width() - posx) < vw) {
           posx = offset;
@@ -73,15 +72,6 @@ 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:
   EvasApp     *mApp;
   Strategy     mStrategy;
@@ -95,13 +85,6 @@ 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)
 {
@@ -132,7 +115,6 @@ main(int argc, char **argv)
    view->show(250);
 
    app->addExitCb(onExitCb, view);
-   app->addRenderPreCb(onRenderPreCb, view);
 
    app->run();
    delete app;
index 48871c5..6fcbae8 100644 (file)
@@ -104,14 +104,6 @@ onKeyCb(void *data, void *extra)
 }
 
 static void
-onRenderPreCb(void *data, void */*extra*/)
-{
-    UxSampleTest *view = (UxSampleTest *)data;
-    if (view->mView)
-        view->mView->render();
-}
-
-static void
 onResizeCb(void *data, void */*extra*/)
 {
     UxSampleTest *view = (UxSampleTest *)data;
@@ -134,7 +126,6 @@ main(int argc, char **argv)
 
    app->addExitCb(onExitCb, view);
    app->addKeyCb(onKeyCb, view);
-   app->addRenderPreCb(onRenderPreCb, view);
    app->addResizeCb(onResizeCb, view);
 
    app->run();