summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaehyun Cho <jae_hyun.cho@samsung.com>2019-12-06 16:27:06 +0000
committerMarcel Hollerbach <mail@marcel-hollerbach.de>2019-12-06 18:04:07 +0100
commitcb817caa808b927937bd1f73428acfc4ad7d03f2 (patch)
tree5348878551745a9f3876b91b436c22f056c1391a
parent4398ec7b3bdec90abbef5765d1b0521ae35ef2f7 (diff)
downloadefl-cb817caa808b927937bd1f73428acfc4ad7d03f2.tar.gz
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 <mail@marcel-hollerbach.de> Differential Revision: https://phab.enlightenment.org/D10812
-rw-r--r--src/lib/evas/canvas/efl_canvas_animation.c4
-rw-r--r--src/lib/evas/canvas/efl_canvas_object_animation.c10
-rw-r--r--src/tests/evas/efl_canvas_animation.c42
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);
}