1 #include <Elementary.h>
4 * @addtogroup Animator Animator
7 * Support normalized frame value for animation.
13 Ecore_Animator *animator;
17 unsigned int repeat_cnt;
18 unsigned int cur_repeat_cnt;
19 double (*curve_op) (double frame);
20 void (*animator_op) (void *data, Elm_Animator *animator, double frame);
22 void (*completion_op) (void *data);
24 Eina_Bool auto_reverse:1;
25 Eina_Bool on_animating:1;
28 static double _animator_curve_linear(double frame);
29 static double _animator_curve_in_out(double frame);
30 static double _animator_curve_in(double frame);
31 static double _animator_curve_out(double frame);
32 static unsigned int _animator_compute_reverse_repeat_count(unsigned int cnt);
33 static unsigned int _animator_compute_no_reverse_repeat_count(unsigned int cnt);
34 static int _animator_animate_cb(void *data);
35 static void _delete_animator(Elm_Animator *animator);
36 //static void _animator_parent_del(void *data);
39 _animator_compute_reverse_repeat_count(unsigned int cnt)
41 return ((cnt + 1) * 2) - 1;
45 _animator_compute_no_reverse_repeat_count(unsigned int cnt)
51 _animator_curve_linear(double frame)
57 _animator_curve_in_out(double frame)
60 return _animator_curve_in(frame * 2) * 0.5;
62 return (_animator_curve_out(frame * 2 - 1) * 0.5) + 0.5;
66 _animator_curve_in(double frame)
68 return 1 - sqrt(1 - pow(frame, 2));
72 _animator_curve_out(double frame)
74 return sqrt(1 - pow(frame - 1, 2));
78 _delete_animator(Elm_Animator *animator)
80 if (animator->animator)
82 ecore_animator_del(animator->animator);
83 animator->animator = NULL;
88 _animator_animate_cb(void *data)
90 Elm_Animator *animator = (Elm_Animator *) data;
91 double elapsed_time, frame, cur_time;
93 animator->cur_time = ecore_loop_time_get();
95 elapsed_time = animator->cur_time - animator->begin_time;
97 if(elapsed_time > animator->duration)
98 elapsed_time = animator->duration;
100 frame = animator->curve_op(elapsed_time / animator->duration);
103 if (animator->auto_reverse)
105 if ((animator->cur_repeat_cnt % 2) == 0)
109 if (animator->duration > 0)
110 animator->animator_op(animator->animator_arg, animator, frame);
112 //Not end. Keep going.
113 if (elapsed_time < animator->duration)
114 return ECORE_CALLBACK_RENEW;
116 //Repeat and reverse and time done!
117 if (animator->cur_repeat_cnt == 0)
119 animator->on_animating = EINA_FALSE;
120 _delete_animator(animator);
121 if (animator->completion_op)
122 animator->completion_op(animator->completion_arg);
123 return ECORE_CALLBACK_CANCEL;
127 --animator->cur_repeat_cnt;
128 animator->begin_time = ecore_loop_time_get();
130 return ECORE_CALLBACK_RENEW;
134 _animator_parent_del(void *data)
136 Elm_Animator *animator = data;
137 elm_animator_del(data);
141 * Get the value of reverse mode.
143 * @param animator Animator object
144 * @return EINA_TRUE is reverse mode
149 elm_animator_auto_reverse_get(Elm_Animator *animator)
153 return animator->auto_reverse;
157 * Get the value of repeat count.
159 * @param animator Animator object
160 * @return Repeat count
165 elm_animator_repeat_get(Elm_Animator *animator)
169 return animator->repeat_cnt;
173 * Set auto reverse function.
175 * @param animator Animator object
176 * @param reverse Reverse or not
181 elm_animator_auto_reverse_set(Elm_Animator *animator, Eina_Bool reverse)
185 if (animator->auto_reverse == reverse)
187 animator->auto_reverse = reverse;
189 animator->repeat_cnt =
190 _animator_compute_reverse_repeat_count(animator->repeat_cnt);
192 animator->repeat_cnt =
193 _animator_compute_no_reverse_repeat_count(animator->repeat_cnt);
197 * Set the animation acceleration style.
199 * @param animator Animator object
200 * @param cs Curve style. Default is ELM_ANIMATOR_CURVE_LINEAR
205 elm_animator_curve_style_set(Elm_Animator *animator,
206 Elm_Animator_Curve_Style cs)
213 case ELM_ANIMATOR_CURVE_LINEAR:
214 animator->curve_op = _animator_curve_linear;
216 case ELM_ANIMATOR_CURVE_IN_OUT:
217 animator->curve_op = _animator_curve_in_out;
219 case ELM_ANIMATOR_CURVE_IN:
220 animator->curve_op = _animator_curve_in;
222 case ELM_ANIMATOR_CURVE_OUT:
223 animator->curve_op = _animator_curve_out;
226 animator->curve_op = _animator_curve_linear;
232 * Set the operation duration.
234 * @param animator Animator object
235 * @param duration Duration in second
240 elm_animator_duration_set(Elm_Animator *animator, double duration)
244 if (animator->on_animating)
246 animator->duration = duration;
250 * Set the callback function for animator operation.
251 * The range of callback function frame data is to 0 ~ 1
252 * User can refer this frame value for one's animation frame data.
253 * @param animator Animator object
254 * @param op Callback function pointer
255 * @param data Callback function user argument
260 elm_animator_operation_callback_set(Elm_Animator *animator,
261 void (*func) (void *data,
262 Elm_Animator *animator,
263 double frame), void *data)
267 if (animator->on_animating)
269 animator->animator_op = func;
270 animator->animator_arg = data;
276 * @param parent Parent object
277 * @return animator object
282 elm_animator_add(Evas_Object *parent)
284 Elm_Animator *animator = calloc(1, sizeof(Elm_Animator));
288 elm_animator_auto_reverse_set(animator, EINA_FALSE);
289 elm_animator_curve_style_set(animator, ELM_ANIMATOR_CURVE_LINEAR);
292 evas_object_event_callback_add(parent, EVAS_CALLBACK_DEL,
293 _animator_parent_del, animator);
296 animator->parent = parent;
302 * Get the status for the animator operation.
304 * @param animator Animator object
305 * @return EINA_TRUE is animator is operating.
310 elm_animator_operating_get(Elm_Animator *animator)
314 return animator->on_animating;
320 * @param animator Animator object
325 elm_animator_del(Elm_Animator *animator)
330 _delete_animator(animator);
332 /* if(animator->parent) {
333 evas_object_event_callback_del(animator->parent, EVAS_CALLBACK_DEL, _animator_parent_del);
340 * Set the callback function for the animator end.
342 * @param animator Animator object
343 * @param op Callback function pointer
344 * @param data Callback function user argument
349 elm_animator_completion_callback_set(Elm_Animator *animator,
350 void (*func) (void *data), void *data)
354 if (animator->on_animating)
356 animator->completion_op = func;
357 animator->completion_arg = data;
361 * Pause the animator.
363 * @param animator Animator object
368 elm_animator_pause(Elm_Animator *animator)
373 if(!animator->on_animating)
376 ecore_animator_freeze(animator->animator);
380 * Resume the animator.
382 * @param animator Animator object
387 elm_animator_resume(Elm_Animator *animator)
392 if(!animator->on_animating)
395 ecore_animator_thaw(animator->animator);
401 * @param animator Animator object
406 elm_animator_stop(Elm_Animator *animator)
410 animator->on_animating = EINA_FALSE;
411 _delete_animator(animator);
415 * Set the animator repeat count.
417 * @param animator Animator object
418 * @param repeat_cnt Repeat count
423 elm_animator_repeat_set(Elm_Animator *animator, unsigned int repeat_cnt)
427 if (!animator->auto_reverse)
428 animator->repeat_cnt = repeat_cnt;
430 animator->repeat_cnt = _animator_compute_reverse_repeat_count(repeat_cnt);
436 * @param animator Animator object
441 elm_animator_animate(Elm_Animator *animator)
445 if (!animator->animator_op)
447 animator->begin_time = ecore_loop_time_get();
448 animator->cur_repeat_cnt = animator->repeat_cnt;
449 if (!animator->animator) {
450 animator->animator = ecore_animator_add(_animator_animate_cb, animator);
452 if (animator->animator)
453 animator->on_animating = EINA_TRUE;