1 #include <Elementary.h>
5 * @defgroup Transit Transit
8 * Transit is designed to set the various effects for the Evas_Object such like translation,
9 * rotation, etc. For using Effects, Create transit and insert the some of effects which are
10 * interested. Each effects has the type of Elm_Effect and those can be inserted into transit.
11 * Once effects are inserted into transit, transit will manage those effects.(ex) deleting).
16 Elm_Animator *animator;
17 Eina_List *effect_list;
18 Evas_Object *block_rect;
19 void (*completion_op) (void *data, Elm_Transit *transit);
21 Eina_Bool reserved_del:1;
26 void (*animation_op) (void *data, Elm_Animator *animator, double frame);
27 void (*begin_op) (void *data, Eina_Bool auto_reverse, unsigned int repeat_cnt);
28 void (*end_op) (void *data, Eina_Bool auto_reverse, unsigned int repeat_cnt);
29 void (*del_op) (void* data);
30 unsigned int shared_cnt;
34 static Evas_Object *_create_block_rect(Evas_Object *parent);
35 static void _transit_animate_cb(void *data, Elm_Animator *animator,
37 static void _transit_fx_begin(Elm_Transit *transit);
38 static void _transit_fx_end(Elm_Transit *transit);
39 static void _transit_complete_cb(void *data);
40 static void _transit_fx_del(Elm_Effect *effect);
41 //static void _transit_parent_del(void *data);
45 _animator_parent_del(void *data)
47 Elm_Transit *transit = data;
48 elm_transit_del(data);
53 _create_block_rect(Evas_Object *parent)
59 rect = evas_object_rectangle_add(evas_object_evas_get(parent));
60 evas_output_size_get(evas_object_evas_get(parent), &w, &h);
61 evas_object_resize(rect, w, h);
62 evas_object_color_set(rect, 0, 0, 0, 0);
67 _transit_animate_cb(void *data, Elm_Animator *animator, double frame)
73 Elm_Transit *transit = data;
75 EINA_LIST_FOREACH(transit->effect_list, elist, effect)
77 effect->animation_op(effect->user_data, animator, frame);
82 _transit_fx_begin(Elm_Transit *transit)
88 Eina_Bool auto_reverse;
90 unsigned int repeat_cnt;
92 auto_reverse = elm_animator_auto_reverse_get(transit->animator);
93 repeat_cnt = elm_animator_repeat_get(transit->animator);
95 EINA_LIST_FOREACH(transit->effect_list, elist, effect)
98 effect->begin_op(effect->user_data, auto_reverse, repeat_cnt);
103 _transit_fx_end(Elm_Transit *transit)
109 Eina_Bool auto_reverse;
111 unsigned int repeat_cnt;
113 auto_reverse = elm_animator_auto_reverse_get(transit->animator);
114 repeat_cnt = elm_animator_repeat_get(transit->animator);
116 EINA_LIST_FOREACH(transit->effect_list, elist, effect)
119 effect->end_op(effect->user_data, auto_reverse, repeat_cnt);
124 _transit_complete_cb(void *data)
126 Elm_Transit *transit = (Elm_Transit *) data;
128 evas_render(evas_object_evas_get(transit->parent));
130 _transit_fx_end(transit);
132 if (transit->block_rect)
133 evas_object_hide(transit->block_rect);
135 if (transit->completion_op)
136 transit->completion_op(transit->completion_arg, transit);
138 if (transit->reserved_del)
140 transit->reserved_del = EINA_FALSE;
141 elm_transit_del(transit);
146 _transit_fx_del(Elm_Effect *effect)
151 --effect->shared_cnt;
153 if (effect->shared_cnt > 0)
157 (*effect->del_op)(effect->user_data);
159 if (effect->user_data)
160 free(effect->user_data);
165 * Set the event blocked when transit is operating.
167 * @param transit Transit object
168 * @param disabled Disable or enable
173 elm_transit_event_block_disabled_set(Elm_Transit *transit, Eina_Bool disabled)
180 if (transit->block_rect)
182 evas_object_del(transit->block_rect);
183 transit->block_rect = NULL;
188 if (transit->block_rect == NULL)
189 transit->block_rect = _create_block_rect(transit->parent);
194 * Get the value of event blockd status.
196 * @param transit Transit
197 * @return EINA_TRUE, when event block is disabled
202 elm_transit_event_block_disabled_get(Elm_Transit *transit)
206 return transit->block_rect ? EINA_TRUE : EINA_FALSE;
210 * Remove effect from transit.
212 * @param transit Transit
213 * @param effect Effect to be removed
214 * @return EINA_TRUE, if the effect is removed
215 * @warning If removed effect does not inserted in any transit, it will be deleted.
220 elm_transit_fx_remove(Elm_Transit *transit, Elm_Effect *effect)
229 EINA_LIST_FOREACH(transit->effect_list, elist, _effect)
231 if (_effect == effect)
233 transit->effect_list =
234 eina_list_remove(transit->effect_list, _effect);
235 _transit_fx_del(_effect);
243 * Remove all current inserted effects.
245 * @param transit Transit
250 elm_transit_fx_clear(Elm_Transit *transit)
259 EINA_LIST_FOREACH(transit->effect_list, elist, effect)
261 transit->effect_list = eina_list_remove(transit->effect_list, effect);
262 _transit_fx_del(effect);
267 * Get the list of current inseted effects.
269 * @param transit Transit
270 * @return Effect list
274 EAPI const Eina_List *
275 elm_transit_fx_get(Elm_Transit *transit)
279 return transit->effect_list;
283 * Set the user-callback function when the transit operation is done.
285 * @param transit Transit
286 * @param op Callback function pointer
287 * @param data Callback funtion user data
292 elm_transit_completion_callback_set(Elm_Transit *transit,
293 void (*op) (void *data,
294 Elm_Transit *transit),
299 transit->completion_op = op;
300 transit->completion_arg = data;
306 * @param transit Transit to be deleted
311 elm_transit_del(Elm_Transit *transit)
315 if (elm_animator_operating_get(transit->animator))
317 transit->reserved_del = EINA_TRUE;
321 if (transit->block_rect)
322 evas_object_del(transit->block_rect);
324 elm_animator_del(transit->animator);
325 elm_transit_fx_clear(transit);
327 // if(transit->parent)
329 // evas_object_event_callback_del(transit->parent, EVAS_CALLBACK_DEL, _transit_parent_del);
336 * Set the transit animation acceleration style.
338 * @param transit Transit
339 * @param cs Curve style(Please refer elm_animator_curve_style_set)
344 elm_transit_curve_style_set(Elm_Transit *transit, Elm_Animator_Curve_Style cs)
348 elm_animator_curve_style_set(transit->animator, cs);
355 * @param parent Parent object
361 elm_transit_add(Evas_Object *parent)
363 Elm_Transit *transit = calloc(1, sizeof(Elm_Transit));
368 transit->animator = elm_animator_add(parent);
370 if (!transit->animator)
376 transit->parent = parent;
377 elm_animator_operation_callback_set(transit->animator, _transit_animate_cb,
379 elm_animator_completion_callback_set(transit->animator, _transit_complete_cb,
381 elm_transit_event_block_disabled_set(transit, EINA_FALSE);
385 evas_object_event_callback_add(parent, EVAS_CALLBACK_DEL, _transit_parent_del,
393 * Set reverse effect automatically.
395 * @param transit Transit
396 * @param reverse EINA_TRUE is reverse.
401 elm_transit_auto_reverse_set(Elm_Transit *transit, Eina_Bool reverse)
405 elm_animator_auto_reverse_set(transit->animator, reverse);
409 * Insert an effect into the transit.
411 * @param transit Transit
412 * @param effect Effect to be inserted
413 * @return EINA_TRUE is success
418 elm_transit_fx_insert(Elm_Transit *transit, Elm_Effect *effect)
427 EINA_LIST_FOREACH(transit->effect_list, elist, _effect)
429 if (_effect == effect)
433 ++effect->shared_cnt;
434 transit->effect_list = eina_list_append(transit->effect_list, effect);
440 * Set the transit repeat count. Effect will be repeated by repeat count.
442 * @param transit Transit
443 * @param repeat Repeat count
448 elm_transit_repeat_set(Elm_Transit *transit, unsigned int repeat)
452 elm_animator_repeat_set(transit->animator, repeat);
456 * Stop the current transit, if the transit is operating.
458 * @param transit Transit
463 elm_transit_stop(Elm_Transit *transit)
467 elm_animator_stop(transit->animator);
471 * Run the all the inserted effects.
473 * @param transit Transit
474 * @param duration Transit time in seconds
479 elm_transit_run(Elm_Transit *transit, double duration)
483 _transit_fx_begin(transit);
484 elm_animator_duration_set(transit->animator, duration);
487 if (transit->block_rect)
488 evas_object_show(transit->block_rect);
490 elm_animator_animate(transit->animator);
492 //If failed to animate.
493 if (!elm_animator_operating_get(transit->animator))
495 if (transit->block_rect)
496 evas_object_hide(transit->block_rect);
497 _transit_fx_end(transit);
504 * @param transit Transit
509 elm_transit_pause(Elm_Transit *transit)
514 elm_animator_pause(transit->animator);
520 * @param transit Transit
525 elm_transit_resume(Elm_Transit *transit)
530 elm_animator_resume(transit->animator);
534 * Get the current frame position
536 * @param transit Transit
537 * @return current frame position (range: 0~1)
542 elm_transit_frame_pos_set(Elm_Transit *transit, double pos)
547 elm_animator_frame_pos_set(transit->animator, pos);
551 * Get the current frame position
553 * @param transit Transit
554 * @return current frame position
559 elm_transit_frame_pos_get(Elm_Transit *transit )
564 return elm_animator_frame_pos_get(transit->animator);
570 /////////////////////////////////////////////////////////////////////////////////////
572 /////////////////////////////////////////////////////////////////////////////////////
573 typedef struct _resizing Elm_Fx_Resizing;
574 static void _elm_fx_resizing_op(void *data, Elm_Animator *animator,
576 static void _elm_fx_resizing_begin(void *data, Eina_Bool auto_reverse,
577 unsigned int repeat_cnt);
589 _elm_fx_resizing_begin(void *data, Eina_Bool auto_reverse,
590 unsigned int repeat_cnt)
592 Elm_Fx_Resizing *resizing = data;
594 evas_object_show(resizing->obj);
595 evas_object_resize(resizing->obj, resizing->from.w, resizing->from.h);
599 _elm_fx_resizing_op(void *data, Elm_Animator *animator, double frame)
603 Elm_Fx_Resizing *resizing = data;
605 w = resizing->from.w + (Evas_Coord) ((float)resizing->to.h * (float)frame);
606 h = resizing->from.h + (Evas_Coord) ((float)resizing->to.w * (float)frame);
607 evas_object_resize(resizing->obj, w, h);
611 * Add Resizing effect.
613 * @param obj Evas_Object that effect is applying to
614 * @param from_w Object width size when effect begins
615 * @param from_h Object height size when effect begins
616 * @param to_w Object width size when effect ends
617 * @param to_h Object height size when effect ends
618 * @return Resizing effect
623 elm_fx_resizing_add(Evas_Object *obj, Evas_Coord from_w, Evas_Coord from_h,
624 Evas_Coord to_w, Evas_Coord to_h)
628 Elm_Fx_Resizing *resizing;
633 effect = calloc(1, sizeof(Elm_Effect));
637 resizing = calloc(1, sizeof(Elm_Fx_Resizing));
645 resizing->from.w = from_w;
646 resizing->from.h = from_h;
647 resizing->to.w = to_w - from_w;
648 resizing->to.h = to_h - from_h;
650 effect->begin_op = _elm_fx_resizing_begin;
651 effect->animation_op = _elm_fx_resizing_op;
652 effect->user_data = resizing;
657 /////////////////////////////////////////////////////////////////////////////////////
659 /////////////////////////////////////////////////////////////////////////////////////
660 typedef struct _translation Elm_Fx_Translation;
661 static void _elm_fx_translation_op(void *data, Elm_Animator *animator,
663 static void _elm_fx_translation_begin(void *data, Eina_Bool auto_reverse,
664 unsigned int repeat_cnt);
665 static void _elm_fx_translation_end(void *data, Eina_Bool auto_reverse,
666 unsigned int repeat_cnt);
678 _elm_fx_translation_begin(void *data, Eina_Bool auto_reverse,
679 unsigned int repeat_cnt)
681 Elm_Fx_Translation *translation = data;
683 evas_object_show(translation->obj);
684 evas_object_move(translation->obj, translation->from.x, translation->from.y);
688 _elm_fx_translation_end(void *data, Eina_Bool auto_reverse,
689 unsigned int repeat_cnt)
691 Elm_Fx_Translation *translation = data;
693 evas_object_move(translation->obj, translation->from.x + translation->to.x,
694 translation->from.y + translation->to.y);
698 _elm_fx_translation_op(void *data, Elm_Animator *animator, double frame)
702 Elm_Fx_Translation *translation = data;
704 x = translation->from.x +
705 (Evas_Coord) ((float)translation->to.x * (float)frame);
706 y = translation->from.y +
707 (Evas_Coord) ((float)translation->to.y * (float)frame);
708 evas_object_move(translation->obj, x, y);
712 * Add Translation effect.
714 * @param obj Evas_Object that effect is applying to
715 * @param from_x Position X when effect begins
716 * @param from_y Position Y when effect begins
717 * @param to_x Position X when effect ends
718 * @param to_y Position Y when effect ends
719 * @return Translation effect
724 elm_fx_translation_add(Evas_Object *obj, Evas_Coord from_x, Evas_Coord from_y,
725 Evas_Coord to_x, Evas_Coord to_y)
729 Elm_Fx_Translation *translation;
734 effect = calloc(1, sizeof(Elm_Effect));
738 translation = calloc(1, sizeof(Elm_Fx_Translation));
746 translation->obj = obj;
747 translation->from.x = from_x;
748 translation->from.y = from_y;
749 translation->to.x = to_x - from_x;
750 translation->to.y = to_y - from_y;
752 effect->begin_op = _elm_fx_translation_begin;
753 effect->end_op = _elm_fx_translation_end;
754 effect->animation_op = _elm_fx_translation_op;
755 effect->user_data = translation;
760 /////////////////////////////////////////////////////////////////////////////////////
762 /////////////////////////////////////////////////////////////////////////////////////
763 typedef struct _zoom Elm_Fx_Zoom;
764 static void _elm_fx_zoom_op(void *data, Elm_Animator * animator,
766 static void _elm_fx_zoom_begin(void *data, Eina_Bool reverse,
767 unsigned int repeat);
768 static void _elm_fx_zoom_end(void *data, Eina_Bool reverse,
769 unsigned int repeat);
778 _elm_fx_zoom_begin(void *data, Eina_Bool reverse, unsigned int repeat)
780 Elm_Fx_Zoom *zoom = data;
782 evas_object_show(zoom->obj);
783 _elm_fx_zoom_op(data, NULL, 0);
787 _elm_fx_zoom_end(void *data, Eina_Bool reverse, unsigned int repeat)
789 Elm_Fx_Zoom *zoom = data;
791 evas_object_map_enable_set(zoom->obj, EINA_FALSE);
795 _elm_fx_zoom_op(void *data, Elm_Animator *animator, double frame)
801 Evas_Coord x, y, w, h;
803 map = evas_map_new(4);
808 evas_object_geometry_get(zoom->obj, &x, &y, &w, &h);
809 evas_map_smooth_set(map, EINA_TRUE);
810 evas_map_util_points_populate_from_object_full(map, zoom->obj,
813 evas_map_util_3d_perspective(map, x + (w / 2), y + (h / 2), 0, 10000);
814 evas_object_map_set(zoom->obj, map);
815 evas_object_map_enable_set(zoom->obj, EINA_TRUE);
822 * @param obj Evas_Object that effect is applying to
823 * @param from_rate Scale rate when effect begins (1 is current rate)
824 * @param to_rate Scale rate when effect ends
825 * @return Zoom effect
830 elm_fx_zoom_add(Evas_Object *obj, float from_rate, float to_rate)
839 effect = calloc(1, sizeof(Elm_Effect));
843 zoom = calloc(1, sizeof(Elm_Fx_Zoom));
851 zoom->from = (10000 - (from_rate * 10000)) * (1 / from_rate);
852 zoom->to = ((10000 - (to_rate * 10000)) * (1 / to_rate)) - zoom->from;
853 effect->begin_op = _elm_fx_zoom_begin;
854 effect->end_op = _elm_fx_zoom_end;
855 effect->animation_op = _elm_fx_zoom_op;
856 effect->user_data = zoom;
862 /////////////////////////////////////////////////////////////////////////////////////
864 /////////////////////////////////////////////////////////////////////////////////////
865 typedef struct _flip Elm_Fx_Flip;
866 static void _elm_fx_flip_op(void *data, Elm_Animator *animator,
868 static void _elm_fx_flip_end(void *data, Eina_Bool auto_reverse,
869 unsigned int repeat_cnt);
875 Elm_Fx_Flip_Axis axis;
880 _elm_fx_flip_end(void *data, Eina_Bool auto_reverse, unsigned int repeat_cnt)
882 Elm_Fx_Flip *flip = data;
884 evas_object_map_enable_set(flip->front, EINA_FALSE);
885 evas_object_map_enable_set(flip->back, EINA_FALSE);
889 _elm_fx_flip_op(void *data, Elm_Animator *animator, double frame)
899 Evas_Coord x, y, w, h;
901 map = evas_map_new(4);
908 degree = (float)(frame * 180);
910 degree = (float)(frame * -180);
912 if (degree < 90 && degree > -90)
915 evas_object_hide(flip->back);
916 evas_object_show(flip->front);
921 evas_object_hide(flip->front);
922 evas_object_show(flip->back);
925 evas_map_smooth_set(map, EINA_TRUE);
926 evas_map_util_points_populate_from_object_full(map, obj, 0);
927 evas_object_geometry_get(obj, &x, &y, &w, &h);
928 Evas_Coord half_w = (w / 2);
930 Evas_Coord half_h = (h / 2);
932 if (flip->axis == ELM_FX_FLIP_AXIS_Y)
934 if ((degree >= 90) || (degree <= -90))
936 evas_map_point_image_uv_set(map, 0, w, 0);
937 evas_map_point_image_uv_set(map, 1, 0, 0);
938 evas_map_point_image_uv_set(map, 2, 0, h);
939 evas_map_point_image_uv_set(map, 3, w, h);
941 evas_map_util_3d_rotate(map, 0, degree, 0, x + half_w, y + half_h, 0);
945 if ((degree >= 90) || (degree <= -90))
947 evas_map_point_image_uv_set(map, 0, 0, h);
948 evas_map_point_image_uv_set(map, 1, w, h);
949 evas_map_point_image_uv_set(map, 2, w, 0);
950 evas_map_point_image_uv_set(map, 3, 0, 0);
952 evas_map_util_3d_rotate(map, degree, 0, 0, x + half_w, y + half_h, 0);
954 evas_map_util_3d_perspective(map, x + half_w, y + half_h, 0, 10000);
955 evas_object_map_enable_set(flip->front, EINA_TRUE);
956 evas_object_map_enable_set(flip->back, EINA_TRUE);
957 evas_object_map_set(obj, map);
964 * @param front Front surface object
965 * @param back Back surface object
966 * @param axis Flipping Axis(X or Y)
967 * @param cw Flipping Direction. EINA_TRUE is clock-wise
968 * @return Flip effect
973 elm_fx_flip_add(Evas_Object *front, Evas_Object *back, Elm_Fx_Flip_Axis axis,
980 if ((!front) || (!back))
983 effect = calloc(1, sizeof(Elm_Effect));
987 flip = calloc(1, sizeof(Elm_Fx_Flip));
999 effect->end_op = _elm_fx_flip_end;
1000 effect->animation_op = _elm_fx_flip_op;
1001 effect->user_data = flip;
1006 /////////////////////////////////////////////////////////////////////////////////////
1008 /////////////////////////////////////////////////////////////////////////////////////
1009 typedef struct _resizable_flip Elm_Fx_ResizableFlip;
1010 static void _elm_fx_resizable_flip_begin(void *data, Eina_Bool reverse,
1011 unsigned int repeat);
1012 static void _elm_fx_resizable_flip_end(void *data, Eina_Bool auto_reverse,
1013 unsigned int repeat_cnt);
1014 static void _elm_fx_resizable_flip_op(void *data, Elm_Animator *animator,
1016 static void _set_image_uv_by_axis_y(Evas_Map *map, Elm_Fx_ResizableFlip *flip,
1018 static void _set_image_uv_by_axis_x(Evas_Map *map, Elm_Fx_ResizableFlip *flip,
1021 struct _resizable_flip
1025 Elm_Fx_Flip_Axis axis;
1029 } from_pos, from_size, to_pos, to_size;
1034 _elm_fx_resizable_flip_begin(void *data, Eina_Bool reverse, unsigned int repeat)
1036 Elm_Fx_ResizableFlip *resizable_flip = data;
1038 evas_object_show(resizable_flip->front);
1039 _elm_fx_resizable_flip_op(data, NULL, 0);
1043 _elm_fx_resizable_flip_end(void *data, Eina_Bool auto_reverse,
1044 unsigned int repeat_cnt)
1046 Elm_Fx_ResizableFlip *resizable_flip = data;
1048 evas_object_map_enable_set(resizable_flip->front, EINA_FALSE);
1049 evas_object_map_enable_set(resizable_flip->back, EINA_FALSE);
1053 _set_image_uv_by_axis_y(Evas_Map *map, Elm_Fx_ResizableFlip *flip,
1056 if ((degree >= 90) || (degree <= -90))
1058 evas_map_point_image_uv_set(map, 0,
1059 (flip->from_size.x * 2) + flip->to_size.x,
1061 evas_map_point_image_uv_set(map, 1, 0, 0);
1062 evas_map_point_image_uv_set(map, 2, 0,
1063 (flip->from_size.y * 2) + flip->to_size.y);
1064 evas_map_point_image_uv_set(map, 3,
1065 (flip->from_size.x * 2) + flip->to_size.x,
1066 (flip->from_size.y * 2) + flip->to_size.y);
1070 evas_map_point_image_uv_set(map, 0, 0, 0);
1071 evas_map_point_image_uv_set(map, 1, flip->from_size.x, 0);
1072 evas_map_point_image_uv_set(map, 2, flip->from_size.x,
1074 evas_map_point_image_uv_set(map, 3, 0, flip->to_size.y);
1079 _set_image_uv_by_axis_x(Evas_Map *map, Elm_Fx_ResizableFlip *flip,
1082 if ((degree >= 90) || (degree <= -90))
1084 evas_map_point_image_uv_set(map, 0, 0,
1085 (flip->from_size.y * 2) + flip->to_size.y);
1086 evas_map_point_image_uv_set(map, 1,
1087 (flip->from_size.x * 2) + flip->to_size.x,
1088 (flip->from_size.y * 2) + flip->to_size.y);
1089 evas_map_point_image_uv_set(map, 2,
1090 (flip->from_size.x * 2) + flip->to_size.x,
1092 evas_map_point_image_uv_set(map, 3, 0, 0);
1096 evas_map_point_image_uv_set(map, 0, 0, 0);
1097 evas_map_point_image_uv_set(map, 1, flip->from_size.x, 0);
1098 evas_map_point_image_uv_set(map, 2, flip->from_size.x,
1100 evas_map_point_image_uv_set(map, 3, 0, flip->to_size.y);
1105 _elm_fx_resizable_flip_op(void *data, Elm_Animator *animator, double frame)
1107 Elm_Fx_ResizableFlip *resizable_flip;
1117 Evas_Coord half_w, half_h;
1119 map = evas_map_new(4);
1123 resizable_flip = data;
1125 if (resizable_flip->cw)
1126 degree = (float)(frame * 180);
1128 degree = (float)(frame * -180);
1130 if ((degree < 90) && (degree > -90))
1132 obj = resizable_flip->front;
1133 evas_object_hide(resizable_flip->back);
1134 evas_object_show(resizable_flip->front);
1138 obj = resizable_flip->back;
1139 evas_object_hide(resizable_flip->front);
1140 evas_object_show(resizable_flip->back);
1143 evas_map_smooth_set(map, EINA_TRUE);
1145 x = resizable_flip->from_pos.x + (resizable_flip->to_pos.x * frame);
1146 y = resizable_flip->from_pos.y + (resizable_flip->to_pos.y * frame);
1147 w = resizable_flip->from_size.x + (resizable_flip->to_size.x * frame);
1148 h = resizable_flip->from_size.y + (resizable_flip->to_size.y * frame);
1149 evas_map_point_coord_set(map, 0, x, y, 0);
1150 evas_map_point_coord_set(map, 1, x + w, y, 0);
1151 evas_map_point_coord_set(map, 2, x + w, y + h, 0);
1152 evas_map_point_coord_set(map, 3, x, y + h, 0);
1154 half_w = (Evas_Coord) (w / 2);
1155 half_h = (Evas_Coord) (h / 2);
1157 if (resizable_flip->axis == ELM_FX_FLIP_AXIS_Y)
1159 _set_image_uv_by_axis_y(map, resizable_flip, degree);
1160 evas_map_util_3d_rotate(map, 0, degree, 0, x + half_w, y + half_h, 0);
1164 _set_image_uv_by_axis_x(map, resizable_flip, degree);
1165 evas_map_util_3d_rotate(map, degree, 0, 0, x + half_w, y + half_h, 0);
1168 evas_map_util_3d_perspective(map, x + half_w, y + half_h, 0, 10000);
1169 evas_object_map_enable_set(resizable_flip->front, EINA_TRUE);
1170 evas_object_map_enable_set(resizable_flip->back, EINA_TRUE);
1171 evas_object_map_set(obj, map);
1176 * Add ResizbleFlip effect. the size of each surface objects are interpolated automatically.
1178 * @param front Front surface object
1179 * @param back Back surface object
1180 * @param axis Flipping Axis.(X or Y)
1181 * @param cw Flipping Direction. EINA_TRUE is clock-wise
1182 * @return Flip effect
1187 elm_fx_resizable_flip_add(Evas_Object *front, Evas_Object *back,
1188 Elm_Fx_Flip_Axis axis, Eina_Bool cw)
1190 Elm_Fx_ResizableFlip *resizable_flip;
1194 Evas_Coord front_x, front_y, front_w, front_h;
1196 Evas_Coord back_x, back_y, back_w, back_h;
1198 if (!front || !back)
1201 effect = calloc(1, sizeof(Elm_Effect));
1205 resizable_flip = calloc(1, sizeof(Elm_Fx_ResizableFlip));
1207 if (!resizable_flip)
1213 resizable_flip->front = front;
1214 resizable_flip->back = back;
1215 resizable_flip->cw = cw;
1216 resizable_flip->axis = axis;
1218 evas_object_geometry_get(resizable_flip->front, &front_x, &front_y, &front_w,
1220 evas_object_geometry_get(resizable_flip->back, &back_x, &back_y, &back_w,
1223 resizable_flip->from_pos.x = front_x;
1224 resizable_flip->from_pos.y = front_y;
1225 resizable_flip->to_pos.x = back_x - front_x;
1226 resizable_flip->to_pos.y = back_y - front_y;
1228 resizable_flip->from_size.x = front_w;
1229 resizable_flip->from_size.y = front_h;
1230 resizable_flip->to_size.x = back_w - front_w;
1231 resizable_flip->to_size.y = back_h - front_h;
1233 effect->begin_op = _elm_fx_resizable_flip_begin;
1234 effect->end_op = _elm_fx_resizable_flip_end;
1235 effect->animation_op = _elm_fx_resizable_flip_op;
1236 effect->user_data = resizable_flip;
1241 /////////////////////////////////////////////////////////////////////////////////////
1243 /////////////////////////////////////////////////////////////////////////////////////
1244 typedef struct _wipe Elm_Fx_Wipe;
1245 static void _elm_fx_wipe_op(void *data, Elm_Animator *animator,
1247 static void _elm_fx_wipe_begin(void *data, Eina_Bool auto_repeat,
1248 unsigned int repeat_cnt);
1249 static void _elm_fx_wipe_end(void *data, Eina_Bool auto_repeat,
1250 unsigned int repeat_cnt);
1251 static void _elm_fx_wipe_hide(Evas_Map * map, Elm_Fx_Wipe_Dir dir,
1252 float x, float y, float w, float h, float frame);
1253 static void _elm_fx_wipe_show(Evas_Map *map, Elm_Fx_Wipe_Dir dir,
1254 float x, float y, float w, float h, float frame);
1259 Elm_Fx_Wipe_Type type;
1260 Elm_Fx_Wipe_Dir dir;
1264 _elm_fx_wipe_begin(void *data, Eina_Bool auto_repeat, unsigned int repeat_cnt)
1266 Elm_Fx_Wipe *wipe = data;
1268 evas_object_show(wipe->obj);
1269 _elm_fx_wipe_op(data, NULL, 0);
1273 _elm_fx_wipe_end(void *data, Eina_Bool auto_repeat, unsigned int repeat_cnt)
1275 Elm_Fx_Wipe *wipe = data;
1277 evas_object_map_enable_set(wipe->obj, EINA_FALSE);
1281 _elm_fx_wipe_hide(Evas_Map * map, Elm_Fx_Wipe_Dir dir, float x, float y,
1282 float w, float h, float frame)
1288 case ELM_FX_WIPE_DIR_LEFT:
1289 w2 = w - (w * frame);
1291 evas_map_point_image_uv_set(map, 0, 0, 0);
1292 evas_map_point_image_uv_set(map, 1, w2, 0);
1293 evas_map_point_image_uv_set(map, 2, w2, h);
1294 evas_map_point_image_uv_set(map, 3, 0, h);
1295 evas_map_point_coord_set(map, 0, x, y, 0);
1296 evas_map_point_coord_set(map, 1, x + w2, y, 0);
1297 evas_map_point_coord_set(map, 2, x + w2, h2, 0);
1298 evas_map_point_coord_set(map, 3, x, h2, 0);
1300 case ELM_FX_WIPE_DIR_RIGHT:
1303 evas_map_point_image_uv_set(map, 0, w2, 0);
1304 evas_map_point_image_uv_set(map, 1, w, 0);
1305 evas_map_point_image_uv_set(map, 2, w, h);
1306 evas_map_point_image_uv_set(map, 3, w2, h);
1307 evas_map_point_coord_set(map, 0, x + w2, y, 0);
1308 evas_map_point_coord_set(map, 1, x + w, y, 0);
1309 evas_map_point_coord_set(map, 2, x + w, h2, 0);
1310 evas_map_point_coord_set(map, 3, x + w2, h2, 0);
1312 case ELM_FX_WIPE_DIR_UP:
1314 h2 = h - (h * frame);
1315 evas_map_point_image_uv_set(map, 0, 0, 0);
1316 evas_map_point_image_uv_set(map, 1, w, 0);
1317 evas_map_point_image_uv_set(map, 2, w, h2);
1318 evas_map_point_image_uv_set(map, 3, 0, h2);
1319 evas_map_point_coord_set(map, 0, x, y, 0);
1320 evas_map_point_coord_set(map, 1, w2, y, 0);
1321 evas_map_point_coord_set(map, 2, w2, h2, 0);
1322 evas_map_point_coord_set(map, 3, x, h2, 0);
1324 case ELM_FX_WIPE_DIR_DOWN:
1327 evas_map_point_image_uv_set(map, 0, 0, h2);
1328 evas_map_point_image_uv_set(map, 1, w, h2);
1329 evas_map_point_image_uv_set(map, 2, w, h);
1330 evas_map_point_image_uv_set(map, 3, 0, h);
1331 evas_map_point_coord_set(map, 0, x, y + h2, 0);
1332 evas_map_point_coord_set(map, 1, w2, y + h2, 0);
1333 evas_map_point_coord_set(map, 2, w2, y + h, 0);
1334 evas_map_point_coord_set(map, 3, x, y + h, 0);
1340 evas_map_util_3d_perspective(map, x + (w / 2), y + (h / 2), 0, 10000);
1344 _elm_fx_wipe_show(Evas_Map *map, Elm_Fx_Wipe_Dir dir, float x, float y,
1345 float w, float h, float frame)
1351 case ELM_FX_WIPE_DIR_LEFT:
1352 w2 = (w - (w * frame));
1354 evas_map_point_image_uv_set(map, 0, w2, 0);
1355 evas_map_point_image_uv_set(map, 1, w, 0);
1356 evas_map_point_image_uv_set(map, 2, w, h);
1357 evas_map_point_image_uv_set(map, 3, w2, h);
1358 evas_map_point_coord_set(map, 0, x + w2, y, 0);
1359 evas_map_point_coord_set(map, 1, w, y, 0);
1360 evas_map_point_coord_set(map, 2, w, h2, 0);
1361 evas_map_point_coord_set(map, 3, x + w2, h2, 0);
1363 case ELM_FX_WIPE_DIR_RIGHT:
1366 evas_map_point_image_uv_set(map, 0, 0, 0);
1367 evas_map_point_image_uv_set(map, 1, w2, 0);
1368 evas_map_point_image_uv_set(map, 2, w2, h);
1369 evas_map_point_image_uv_set(map, 3, 0, h);
1370 evas_map_point_coord_set(map, 0, x, y, 0);
1371 evas_map_point_coord_set(map, 1, x + w2, y, 0);
1372 evas_map_point_coord_set(map, 2, x + w2, h2, 0);
1373 evas_map_point_coord_set(map, 3, x, h2, 0);
1375 case ELM_FX_WIPE_DIR_UP:
1377 h2 = (h - (h * frame));
1378 evas_map_point_image_uv_set(map, 0, 0, h2);
1379 evas_map_point_image_uv_set(map, 1, w, h2);
1380 evas_map_point_image_uv_set(map, 2, w, h);
1381 evas_map_point_image_uv_set(map, 3, 0, h);
1382 evas_map_point_coord_set(map, 0, x, y + h2, 0);
1383 evas_map_point_coord_set(map, 1, w2, y + h2, 0);
1384 evas_map_point_coord_set(map, 2, w2, y + h, 0);
1385 evas_map_point_coord_set(map, 3, x, y + h, 0);
1387 case ELM_FX_WIPE_DIR_DOWN:
1390 evas_map_point_image_uv_set(map, 0, 0, 0);
1391 evas_map_point_image_uv_set(map, 1, w, 0);
1392 evas_map_point_image_uv_set(map, 2, w, h2);
1393 evas_map_point_image_uv_set(map, 3, 0, h2);
1394 evas_map_point_coord_set(map, 0, x, y, 0);
1395 evas_map_point_coord_set(map, 1, w2, y, 0);
1396 evas_map_point_coord_set(map, 2, w2, y + h2, 0);
1397 evas_map_point_coord_set(map, 3, x, y + h2, 0);
1403 evas_map_util_3d_perspective(map, x + (w / 2), y + (h / 2), 0, 10000);
1407 _elm_fx_wipe_op(void *data, Elm_Animator *animator, double frame)
1413 Evas_Coord _x, _y, _w, _h;
1415 map = evas_map_new(4);
1420 evas_map_smooth_set(map, EINA_TRUE);
1421 evas_object_geometry_get(wipe->obj, &_x, &_y, &_w, &_h);
1423 if (wipe->type == ELM_FX_WIPE_TYPE_SHOW)
1424 _elm_fx_wipe_show(map, wipe->dir, _x, _y, _w, _h, (float)frame);
1426 _elm_fx_wipe_hide(map, wipe->dir, _x, _y, _w, _h, (float)frame);
1428 evas_object_map_enable_set(wipe->obj, EINA_TRUE);
1429 evas_object_map_set(wipe->obj, map);
1436 * @param obj Evas_Object that effect is applying to
1437 * @param type Wipe type. Hide or show
1438 * @param dir Wipe Direction
1439 * @return Wipe effect
1444 elm_fx_wipe_add(Evas_Object *obj, Elm_Fx_Wipe_Type type, Elm_Fx_Wipe_Dir dir)
1453 effect = calloc(1, sizeof(Elm_Effect));
1457 wipe = calloc(1, sizeof(Elm_Fx_Wipe));
1467 effect->begin_op = _elm_fx_wipe_begin;
1468 effect->end_op = _elm_fx_wipe_end;
1469 effect->animation_op = _elm_fx_wipe_op;
1470 effect->user_data = wipe;
1475 /////////////////////////////////////////////////////////////////////////////////////
1477 /////////////////////////////////////////////////////////////////////////////////////
1478 typedef struct _color Elm_Fx_Color;
1479 static void _elm_fx_color_begin(void *data, Eina_Bool auto_reverse, unsigned int repeat_cnt);
1480 static void _elm_fx_color_op(void *data, Elm_Animator *animator, double frame);
1485 struct _unsigned_color
1487 unsigned int r, g, b, a;
1489 struct _signed_color
1496 _elm_fx_color_begin(void *data, Eina_Bool auto_reverse, unsigned int repeat_cnt)
1498 Elm_Fx_Color *color = data;
1500 evas_object_show(color->obj);
1504 _elm_fx_color_op(void *data, Elm_Animator *animator, double frame)
1506 Elm_Fx_Color *color;
1508 unsigned int r, g, b, a;
1511 r = (color->from.r + (int)((float)color->to.r * frame));
1512 g = (color->from.g + (int)((float)color->to.g * frame));
1513 b = (color->from.b + (int)((float)color->to.b * frame));
1514 a = (color->from.a + (int)((float)color->to.a * frame));
1516 evas_object_color_set(color->obj, r, g, b, a);
1522 * @param obj Evas_Object that effect is applying to
1523 * @param from_r RGB R when effect begins
1524 * @param from_g RGB G when effect begins
1525 * @param from_b RGB B when effect begins
1526 * @param from_a RGB A when effect begins
1527 * @param to_r RGB R when effect ends
1528 * @param to_g RGB G when effect ends
1529 * @param to_b RGB B when effect ends
1530 * @param to_a RGB A when effect ends
1531 * @return Color Effect
1536 elm_fx_color_add(Evas_Object *obj, unsigned int from_r, unsigned int from_g,
1537 unsigned int from_b, unsigned int from_a, unsigned int to_r,
1538 unsigned int to_g, unsigned int to_b, unsigned int to_a)
1542 Elm_Fx_Color *color;
1547 effect = calloc(1, sizeof(Elm_Effect));
1551 color = calloc(1, sizeof(Elm_Fx_Color));
1559 color->from.r = from_r;
1560 color->from.g = from_g;
1561 color->from.b = from_b;
1562 color->from.a = from_a;
1563 color->to.r = to_r - from_r;
1564 color->to.g = to_g - from_g;
1565 color->to.b = to_b - from_b;
1566 color->to.a = to_a - from_a;
1568 effect->begin_op = _elm_fx_color_begin;
1569 effect->animation_op = _elm_fx_color_op;
1570 effect->user_data = color;
1575 /////////////////////////////////////////////////////////////////////////////////////
1577 /////////////////////////////////////////////////////////////////////////////////////
1578 typedef struct _fade Elm_Fx_Fade;
1579 static void _elm_fx_fade_begin(void *data, Eina_Bool auto_reverse,
1580 unsigned int repeat_cnt);
1581 static void _elm_fx_fade_end(void *data, Eina_Bool auto_reverse,
1582 unsigned int repeat_cnt);
1583 static void _elm_fx_fade_op(void *data, Elm_Animator *animator,
1588 Evas_Object *before;
1590 struct _signed_color before_color, after_color;
1593 Eina_Bool inversed:1;
1597 _elm_fx_fade_begin(void *data, Eina_Bool auto_reverse, unsigned int repeat_cnt)
1599 Elm_Fx_Fade *fade = data;
1601 fade->inversed = EINA_FALSE;
1605 _elm_fx_fade_end(void *data, Eina_Bool auto_reverse, unsigned int repeat_cnt)
1607 Elm_Fx_Fade *fade = data;
1609 evas_object_color_set(fade->before, fade->before_color.r,
1610 fade->before_color.g, fade->before_color.b,
1611 fade->before_color.a);
1612 evas_object_color_set(fade->after, fade->after_color.r, fade->after_color.g,
1613 fade->after_color.b, fade->after_color.a);
1617 _elm_fx_fade_op(void *data, Elm_Animator *animator, double frame)
1627 if (!fade->inversed)
1629 evas_object_hide(fade->after);
1630 evas_object_show(fade->before);
1631 fade->inversed = EINA_TRUE;
1634 _frame = (1 - (frame * 2));
1636 evas_object_color_set(fade->before, fade->before_color.r * _frame,
1637 fade->before_color.g * _frame,
1638 fade->before_color.b * _frame,
1639 fade->before_color.a + fade->before_alpha * (1 -
1646 evas_object_hide(fade->before);
1647 evas_object_show(fade->after);
1648 fade->inversed = EINA_FALSE;
1651 _frame = ((frame - 0.5) * 2);
1653 evas_object_color_set(fade->after, fade->after_color.r * _frame,
1654 fade->after_color.g * _frame,
1655 fade->after_color.b * _frame,
1656 fade->after_color.a + fade->after_alpha * (1 -
1665 * @param before Evas Object before fade in
1666 * @param after Evas Object after fade out
1667 * @return Fade effect
1672 elm_fx_fade_add(Evas_Object *before, Evas_Object *after)
1678 if ((!before) && (!after))
1681 effect = calloc(1, sizeof(Elm_Effect));
1685 fade = calloc(1, sizeof(Elm_Fx_Fade));
1693 evas_object_color_get(before, &fade->before_color.r, &fade->before_color.g,
1694 &fade->before_color.b, &fade->before_color.a);
1695 evas_object_color_get(after, &fade->after_color.r, &fade->after_color.g,
1696 &fade->after_color.b, &fade->after_color.a);
1698 fade->before = before;
1699 fade->after = after;
1700 fade->before_alpha = (255 - fade->before_color.a);
1701 fade->after_alpha = (255 - fade->after_color.a);
1703 effect->begin_op = _elm_fx_fade_begin;
1704 effect->end_op = _elm_fx_fade_end;
1705 effect->animation_op = _elm_fx_fade_op;
1706 effect->user_data = fade;
1711 /////////////////////////////////////////////////////////////////////////////////////
1713 /////////////////////////////////////////////////////////////////////////////////////
1714 typedef struct _blend Elm_Fx_Blend;
1715 static void _elm_fx_blend_begin(void *data, Eina_Bool auto_reverse,
1716 unsigned int repeat_cnt);
1717 static void _elm_fx_blend_end(void *data, Eina_Bool auto_reverse,
1718 unsigned int repeat_cnt);
1719 static void _elm_fx_blend_op(void *data, Elm_Animator *animator,
1724 Evas_Object *before;
1726 struct _signed_color from, to;
1730 _elm_fx_blend_begin(void *data, Eina_Bool auto_reverse, unsigned int repeat_cnt)
1732 Elm_Fx_Blend *blend = data;
1734 evas_object_show(blend->before);
1738 _elm_fx_blend_end(void *data, Eina_Bool auto_reverse, unsigned int repeat_cnt)
1740 Elm_Fx_Blend *blend = data;
1742 evas_object_color_set(blend->before, blend->from.r, blend->from.g,
1743 blend->from.b, blend->from.a);
1744 evas_object_color_set(blend->after, blend->to.r, blend->to.g, blend->to.b,
1747 evas_object_hide(blend->before);
1749 evas_object_hide(blend->after);
1753 _elm_fx_blend_op(void *data, Elm_Animator *animator, double frame)
1755 Elm_Fx_Blend *blend = data;
1757 evas_object_show(blend->after);
1758 evas_object_color_set(blend->before, (int)(blend->from.r * (1 - frame)),
1759 (int)(blend->from.g * (1 - frame)),
1760 (int)(blend->from.b * (1 - frame)),
1761 (int)(blend->from.a * (1 - frame)));
1762 evas_object_color_set(blend->after, (int)(blend->to.r * frame),
1763 (int)(blend->to.g * frame), (int)(blend->to.b * frame),
1764 (int)(blend->to.a * frame));
1770 * @param before Evas Object before blending
1771 * @param after Evas Object after blending
1772 * @return Blend effect
1777 elm_fx_blend_add(Evas_Object *before, Evas_Object *after)
1781 Elm_Fx_Blend *blend;
1783 if ((!before) && (!after))
1786 effect = calloc(1, sizeof(Elm_Effect));
1790 blend = calloc(1, sizeof(Elm_Fx_Blend));
1797 blend->before = before;
1798 blend->after = after;
1799 evas_object_color_get(before, &blend->from.r, &blend->from.g, &blend->from.b,
1801 evas_object_color_get(after, &blend->to.r, &blend->to.g, &blend->to.b,
1804 effect->begin_op = _elm_fx_blend_begin;
1805 effect->end_op = _elm_fx_blend_end;
1806 effect->animation_op = _elm_fx_blend_op;
1807 effect->user_data = blend;
1812 /////////////////////////////////////////////////////////////////////////////////////
1814 /////////////////////////////////////////////////////////////////////////////////////
1815 typedef struct _rotation Elm_Fx_Rotation;
1816 static void _elm_fx_rotation_begin(void *data, Eina_Bool auto_reverse,
1817 unsigned int repeat_cnt);
1818 static void _elm_fx_rotation_end(void *data, Eina_Bool auto_reverse,
1819 unsigned int repeat_cnt);
1820 static void _elm_fx_rotation_op(void *data, Elm_Animator *animator,
1831 _elm_fx_rotation_begin(void *data, Eina_Bool auto_reverse,
1832 unsigned int repeat_cnt)
1834 Elm_Fx_Rotation *rotation = data;
1836 evas_object_show(rotation->obj);
1840 _elm_fx_rotation_end(void *data, Eina_Bool auto_reverse,
1841 unsigned int repeat_cnt)
1843 Elm_Fx_Rotation *rotation = data;
1845 evas_object_map_enable_set(rotation->obj, EINA_FALSE);
1849 _elm_fx_rotation_op(void *data, Elm_Animator *animator, double frame)
1851 Elm_Fx_Rotation *rotation;
1855 Evas_Coord x, y, w, h;
1859 float half_w, half_h;
1861 map = evas_map_new(4);
1867 evas_map_smooth_set(map, EINA_TRUE);
1868 evas_map_util_points_populate_from_object_full(map, rotation->obj, 0);
1869 degree = rotation->from + (float)(frame * rotation->to);
1874 evas_object_geometry_get(rotation->obj, &x, &y, &w, &h);
1876 half_w = (float)w *0.5;
1878 half_h = (float)h *0.5;
1880 evas_map_util_3d_rotate(map, 0, 0, degree, x + half_w, y + half_h, 0);
1881 evas_map_util_3d_perspective(map, x + half_w, y + half_h, 0, 10000);
1882 evas_object_map_enable_set(rotation->obj, EINA_TRUE);
1883 evas_object_map_set(rotation->obj, map);
1888 * Add Rotation effect
1890 * @param obj Evas_Object that effect is applying to
1891 * @param from degree Degree when effect begins
1892 * @param to_degree Degree when effect is ends
1893 * @param cw Rotation direction. EINA_TRUE is clock wise
1894 * @return Rotation effect
1899 elm_fx_rotation_add(Evas_Object *obj, float from_degree, float to_degree,
1904 Elm_Fx_Rotation *rotation;
1909 effect = calloc(1, sizeof(Elm_Effect));
1913 rotation = calloc(1, sizeof(Elm_Fx_Rotation));
1921 rotation->obj = obj;
1922 rotation->from = from_degree;
1923 rotation->to = to_degree - from_degree;
1926 effect->begin_op = _elm_fx_rotation_begin;
1927 effect->end_op = _elm_fx_rotation_end;
1928 effect->animation_op = _elm_fx_rotation_op;
1929 effect->user_data = rotation;
1934 /////////////////////////////////////////////////////////////////////////////////////
1935 // ImageAnimation FX
1936 /////////////////////////////////////////////////////////////////////////////////////
1937 typedef struct _image_animation Elm_Fx_Image_Animation;
1938 static void _elm_fx_image_animation_begin(void *data, Eina_Bool auto_reverse,
1939 unsigned int repeat_cnt);
1940 static void _elm_fx_image_animation_op(void *data, Elm_Animator *animator,
1942 EAPI Elm_Effect *elm_fx_image_animation_add(Evas_Object *obj, const char **images,
1943 unsigned int item_num);
1945 struct _image_animation
1954 _elm_fx_image_animation_begin(void *data, Eina_Bool auto_reverse,
1955 unsigned int repeat_cnt)
1957 Elm_Fx_Image_Animation *image_animation = data;
1958 evas_object_show(image_animation->obj);
1963 _elm_fx_image_animation_op(void *data, Elm_Animator *animator, double frame)
1965 Elm_Fx_Image_Animation *image_animation = (Elm_Fx_Image_Animation *) data;
1966 elm_icon_file_set(image_animation->obj,
1967 image_animation->images[ (int) floor(frame * image_animation->img_cnt) ], NULL);
1971 _elm_fx_image_animation_del(void *data)
1974 Elm_Fx_Image_Animation *image_animation = data;
1976 for(idx = 0; idx < image_animation->img_cnt; ++idx ) {
1977 eina_stringshare_del(image_animation->images[ idx ]);
1980 free(image_animation->images);
1984 * Add image_animation effect.
1986 * @param obj Icon object
1987 * @param images Array of image file path.
1988 * @param img_cnt Count of image.
1989 * @return ImageAnimation effect.
1994 elm_fx_image_animation_add(Evas_Object *obj, const char **images,
1995 unsigned int img_cnt)
1998 Elm_Fx_Image_Animation *image_animation;
2001 if ((!obj) || !images || !(*images))
2004 effect = calloc(1, sizeof(Elm_Effect));
2008 image_animation = calloc(1, sizeof(Elm_Fx_Image_Animation));
2010 if (!image_animation)
2016 image_animation->obj = obj;
2017 image_animation->images = calloc( img_cnt, sizeof(char*));
2018 for(idx = 0; idx < img_cnt; ++idx )
2019 image_animation->images[ idx ] = eina_stringshare_add( images[ idx ] );
2021 image_animation->img_cnt = img_cnt;
2023 effect->begin_op = _elm_fx_image_animation_begin;
2024 effect->animation_op = _elm_fx_image_animation_op;
2025 effect->del_op = _elm_fx_image_animation_del;
2026 effect->user_data = image_animation;