bu5hm4n pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=cb817caa808b927937bd1f73428acfc4ad7d03f2

commit cb817caa808b927937bd1f73428acfc4ad7d03f2
Author: Jaehyun Cho <[email protected]>
Date:   Fri Dec 6 16:27:06 2019 +0000

    efl_canvas_object_animation: support duration 0
    
    The duration of animation means how long the animation is executed.
    Therefore, if duration is 0, then the final state of animation should be
    applied to the target object immediately.
    
    In this case, if final_state_keep is true, then the final state of
    animation is preserved. Otherwise, the final state of animation is not
    preserved.
    
    ref T8436, T8513
    
    Reviewed-by: Marcel Hollerbach <[email protected]>
    Differential Revision: https://phab.enlightenment.org/D10812
---
 src/lib/evas/canvas/efl_canvas_animation.c        |  4 +--
 src/lib/evas/canvas/efl_canvas_object_animation.c | 10 +++++-
 src/tests/evas/efl_canvas_animation.c             | 42 +++++++++++++++++++++++
 3 files changed, 53 insertions(+), 3 deletions(-)

diff --git a/src/lib/evas/canvas/efl_canvas_animation.c 
b/src/lib/evas/canvas/efl_canvas_animation.c
index 53d006fd20..ae88deca24 100644
--- a/src/lib/evas/canvas/efl_canvas_animation.c
+++ b/src/lib/evas/canvas/efl_canvas_animation.c
@@ -9,7 +9,7 @@ _efl_canvas_animation_duration_set(Eo *eo_obj EINA_UNUSED,
                             Efl_Canvas_Animation_Data *pd,
                             double sec)
 {
-   EINA_SAFETY_ON_FALSE_RETURN(sec > 0.0);
+   EINA_SAFETY_ON_FALSE_RETURN(sec >= 0.0);
    pd->duration = sec;
 }
 
@@ -146,7 +146,7 @@ _efl_canvas_animation_efl_object_constructor(Eo *obj, 
Efl_Canvas_Animation_Data
 EOLIAN static void
 _efl_canvas_animation_default_duration_set(double animation_time)
 {
-   EINA_SAFETY_ON_FALSE_RETURN(animation_time > 0.0);
+   EINA_SAFETY_ON_FALSE_RETURN(animation_time >= 0.0);
    _default_animation_time = animation_time;
 }
 
diff --git a/src/lib/evas/canvas/efl_canvas_object_animation.c 
b/src/lib/evas/canvas/efl_canvas_object_animation.c
index 3fbc0e94f4..3069d067ba 100644
--- a/src/lib/evas/canvas/efl_canvas_object_animation.c
+++ b/src/lib/evas/canvas/efl_canvas_object_animation.c
@@ -43,7 +43,15 @@ _animator_cb(void *data, const Efl_Event *ev EINA_UNUSED)
 
    duration = efl_animation_duration_get(pd->in->animation) / pd->in->speed;
    elapsed_time = current - pd->in->run_start_time;
-   vector = elapsed_time / duration;
+   if (EINA_DBL_EQ(duration, 0))
+     {
+        if (pd->in->speed < 0.0)
+          vector = -1.0;
+        else
+          vector = 1.0;
+     }
+   else
+     vector = elapsed_time / duration;
 
    /* When animation player starts, _animator_cb() is called immediately so
     * both elapsed time and progress are 0.0.
diff --git a/src/tests/evas/efl_canvas_animation.c 
b/src/tests/evas/efl_canvas_animation.c
index e7d0b16ff9..19b47a6429 100644
--- a/src/tests/evas/efl_canvas_animation.c
+++ b/src/tests/evas/efl_canvas_animation.c
@@ -42,8 +42,50 @@ EFL_START_TEST(efl_canvas_animation_default_value)
 }
 EFL_END_TEST
 
+static void
+_duration_zero_anim_running_cb(void *data, const Efl_Event *event)
+{
+   double animation_speed = *((double*) data);
+   double animation_running_position = *((double*) event->info);
+
+   if (animation_speed > 0.0)
+     ck_assert(EINA_DBL_EQ(animation_running_position, 1.0));
+   else
+     ck_assert(EINA_DBL_EQ(animation_running_position, 0.0));
+}
+
+static void
+helper_inc_int(void *data, const Efl_Event *event EINA_UNUSED)
+{
+   int *called = (int*) data;
+   *called+=1;
+}
+
+EFL_START_TEST(efl_canvas_animation_duration_zero)
+{
+   int running = 0;
+   Evas *evas = EVAS_TEST_INIT_EVAS();
+   Efl_Canvas_Rectangle *obj = efl_add(EFL_CANVAS_RECTANGLE_CLASS, evas);
+   Efl_Canvas_Animation *animation = efl_add(EFL_CANVAS_ANIMATION_CLASS, evas, 
efl_animation_duration_set(efl_added, 0.0));
+
+   double animation_speed = 1.0;
+   efl_event_callback_add(obj, 
EFL_CANVAS_OBJECT_ANIMATION_EVENT_ANIMATION_PROGRESS_UPDATED, 
_duration_zero_anim_running_cb, &animation_speed);
+   efl_event_callback_add(obj, 
EFL_CANVAS_OBJECT_ANIMATION_EVENT_ANIMATION_PROGRESS_UPDATED, helper_inc_int , 
&running);
+   efl_canvas_object_animation_start(obj, animation, animation_speed, 0.0);
+   ck_assert(EINA_DBL_EQ(efl_canvas_object_animation_progress_get(obj), -1.0));
+   ck_assert_int_eq(running, 1);
+
+   running = 0;
+   animation_speed = -1.0;
+   efl_canvas_object_animation_start(obj, animation, animation_speed, 0.0);
+   ck_assert(EINA_DBL_EQ(efl_canvas_object_animation_progress_get(obj), -1.0));
+   ck_assert_int_eq(running, 1);
+}
+EFL_END_TEST
+
 void efl_test_canvas_animation(TCase *tc)
 {
    tcase_add_test(tc, efl_canvas_animation_negative_double_checking);
    tcase_add_test(tc, efl_canvas_animation_default_value);
+   tcase_add_test(tc, efl_canvas_animation_duration_zero);
 }

-- 


Reply via email to