1 #include <Elementary.h>
5 * @addtogroup Animator Animator
8 * Support normalized frame value for animation.
14 Ecore_Animator *animator;
18 unsigned int repeat_cnt;
19 unsigned int cur_repeat_cnt;
20 double (*curve_op) (double frame);
21 void (*animator_op) (void *data, Elm_Animator *animator, double frame);
23 void (*completion_op) (void *data);
25 Eina_Bool auto_reverse:1;
26 Eina_Bool on_animating:1;
29 static double _animator_curve_linear(double frame);
30 static double _animator_curve_in_out(double frame);
31 static double _animator_curve_in(double frame);
32 static double _animator_curve_out(double frame);
33 static unsigned int _animator_compute_reverse_repeat_count(unsigned int cnt);
34 static unsigned int _animator_compute_no_reverse_repeat_count(unsigned int cnt);
35 static Eina_Bool _animator_animate_cb(void *data);
36 static void _delete_animator(Elm_Animator *animator);
37 static void _animator_parent_del(void *data, Evas *evas, Evas_Object *obj, void *event);
40 _animator_compute_reverse_repeat_count(unsigned int cnt)
42 return ((cnt + 1) * 2) - 1;
46 _animator_compute_no_reverse_repeat_count(unsigned int cnt)
52 _animator_curve_linear(double frame)
58 _animator_curve_in_out(double frame)
61 return _animator_curve_out(frame * 2) * 0.5;
63 return (_animator_curve_in(frame * 2 - 1) * 0.5) + 0.5;
67 _animator_curve_in(double frame)
69 return sqrt(1 - pow(frame - 1, 2));
73 _animator_curve_out(double frame)
75 return 1 - sqrt(1 - pow(frame, 2));
79 _delete_animator(Elm_Animator *animator)
81 if (animator->animator)
83 ecore_animator_del(animator->animator);
84 animator->animator = NULL;
89 _animator_animate_cb(void *data)
91 Elm_Animator *animator = (Elm_Animator *) data;
93 animator->cur_time = ecore_loop_time_get();
94 double elapsed_time = animator->cur_time - animator->begin_time;
96 if (elapsed_time > animator->duration)
97 elapsed_time = animator->duration;
99 double frame = animator->curve_op(elapsed_time / animator->duration);
102 if (animator->auto_reverse)
104 if ((animator->cur_repeat_cnt % 2) == 0)
108 if (animator->duration > 0)
109 animator->animator_op(animator->animator_arg, animator, frame);
111 //Not end. Keep going.
112 if (elapsed_time < animator->duration)
113 return ECORE_CALLBACK_RENEW;
115 //Repeat and reverse and time done!
116 if (animator->cur_repeat_cnt == 0)
118 animator->on_animating = EINA_FALSE;
119 _delete_animator(animator);
120 if (animator->completion_op)
121 animator->completion_op(animator->completion_arg);
122 return ECORE_CALLBACK_CANCEL;
126 --animator->cur_repeat_cnt;
127 animator->begin_time = ecore_loop_time_get();
129 return ECORE_CALLBACK_RENEW;
133 _animator_parent_del(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event __UNUSED__)
135 elm_animator_del(data);
139 * Get the value of reverse mode.
141 * @param animator Animator object
142 * @return EINA_TRUE is reverse mode
147 elm_animator_auto_reverse_get(Elm_Animator *animator)
149 if (!animator) return EINA_FALSE;
150 return animator->auto_reverse;
154 * Get the value of repeat count.
156 * @param animator Animator object
157 * @return Repeat count
162 elm_animator_repeat_get(Elm_Animator *animator)
164 if (!animator) return EINA_FALSE;
165 return animator->repeat_cnt;
169 * Set auto reverse function.
171 * @param animator Animator object
172 * @param reverse Reverse or not
177 elm_animator_auto_reverse_set(Elm_Animator *animator, Eina_Bool reverse)
179 if (!animator) return;
180 if (animator->auto_reverse == reverse) return;
181 animator->auto_reverse = reverse;
184 animator->repeat_cnt =
185 _animator_compute_reverse_repeat_count(animator->repeat_cnt);
189 animator->repeat_cnt =
190 _animator_compute_no_reverse_repeat_count(animator->repeat_cnt);
195 * Set the animation acceleration style.
197 * @param animator Animator object
198 * @param cs Curve style. Default is ELM_ANIMATOR_CURVE_LINEAR
203 elm_animator_curve_style_set(Elm_Animator *animator, Elm_Animator_Curve_Style cs)
205 if (!animator) return;
208 case ELM_ANIMATOR_CURVE_LINEAR:
209 animator->curve_op = _animator_curve_linear;
211 case ELM_ANIMATOR_CURVE_IN_OUT:
212 animator->curve_op = _animator_curve_in_out;
214 case ELM_ANIMATOR_CURVE_IN:
215 animator->curve_op = _animator_curve_in;
217 case ELM_ANIMATOR_CURVE_OUT:
218 animator->curve_op = _animator_curve_out;
221 animator->curve_op = _animator_curve_linear;
227 * Set the operation duration.
229 * @param animator Animator object
230 * @param duration Duration in second
235 elm_animator_duration_set(Elm_Animator *animator, double duration)
237 if (!animator) return;
238 if (animator->on_animating) return;
239 animator->duration = duration;
243 * Set the callback function for animator operation.
244 * The range of callback function frame data is to 0 ~ 1
245 * User can refer this frame value for one's animation frame data.
246 * @param animator Animator object
247 * @param op Callback function pointer
248 * @param data Callback function user argument
253 elm_animator_operation_callback_set(Elm_Animator *animator,
254 void (*func) (void *data,
255 Elm_Animator *animator,
256 double frame), void *data)
258 if (!animator) return;
259 if (animator->on_animating) return;
260 animator->animator_op = func;
261 animator->animator_arg = data;
267 * @param parent Parent object
268 * @return animator object
273 elm_animator_add(Evas_Object *parent)
275 Elm_Animator *animator = calloc(1, sizeof(Elm_Animator));
277 if (!animator) return NULL;
278 elm_animator_auto_reverse_set(animator, EINA_FALSE);
279 elm_animator_curve_style_set(animator, ELM_ANIMATOR_CURVE_LINEAR);
282 evas_object_event_callback_add(parent, EVAS_CALLBACK_DEL,
283 _animator_parent_del, animator);
285 animator->parent = parent;
291 * Get the status for the animator operation.
293 * @param animator Animator object
294 * @return EINA_TRUE is animator is operating.
299 elm_animator_operating_get(Elm_Animator *animator)
301 if (!animator) return EINA_FALSE;
302 return animator->on_animating;
308 * @param animator Animator object
313 elm_animator_del(Elm_Animator *animator)
315 if (!animator) return;
316 _delete_animator(animator);
319 evas_object_event_callback_del(animator->parent, EVAS_CALLBACK_DEL,
320 _animator_parent_del);
325 * Set the callback function for the animator end.
327 * @param animator Animator object
328 * @param op Callback function pointer
329 * @param data Callback function user argument
334 elm_animator_completion_callback_set(Elm_Animator *animator,
335 void (*func) (void *data), void *data)
337 if (!animator) return;
338 if (animator->on_animating) return;
339 animator->completion_op = func;
340 animator->completion_arg = data;
346 * @param animator Animator object
351 elm_animator_stop(Elm_Animator *animator)
353 if (!animator) return;
354 animator->on_animating = EINA_FALSE;
355 _delete_animator(animator);
359 * Set the animator repeat count.
361 * @param animator Animator object
362 * @param repeat_cnt Repeat count
367 elm_animator_repeat_set(Elm_Animator *animator, unsigned int repeat_cnt)
369 if (!animator) return;
370 if (!animator->auto_reverse)
371 animator->repeat_cnt = repeat_cnt;
374 animator->repeat_cnt =
375 _animator_compute_reverse_repeat_count(repeat_cnt);
382 * @param animator Animator object
387 elm_animator_animate(Elm_Animator *animator)
389 if (!animator) return;
390 if (!animator->animator_op) return;
391 animator->begin_time = ecore_loop_time_get();
392 animator->on_animating = EINA_TRUE;
393 animator->cur_repeat_cnt = animator->repeat_cnt;
394 if (!animator->animator)
395 animator->animator = ecore_animator_add(_animator_animate_cb, animator);
396 if (!animator->animator)
397 animator->on_animating = EINA_FALSE;