Add smack rule
[apps/core/preloaded/ug-camera-efl.git] / src / cam_ui_effect_utils.c
1 /*\r
2  * Copyright 2012  Samsung Electronics Co., Ltd\r
3  *\r
4  * Licensed under the Flora License, Version 1.1 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *        http://floralicense.org/license/\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 \r
17 \r
18 #include "cam_ui_effect_utils.h"\r
19 static gboolean __focus_zoom_origin_state = TRUE;\r
20 static Elm_Transit *zoom_transit_effect = NULL;\r
21 \r
22 gboolean cam_ui_effect_utils_get_zoom_state()\r
23 {\r
24         return __focus_zoom_origin_state;\r
25 }\r
26 \r
27 static void __zoom_effect_transit_del_cb(void *data, Elm_Transit *transit)\r
28 {\r
29         DEBUG_TRACE("TODO: set default transit callback process");\r
30         zoom_transit_effect = NULL;\r
31 }\r
32 \r
33 /*\r
34 *       note: it is for cam_ui_effect_utils_set_zoom_effect\r
35 *       and now: there will be always  one zoom effect running for\r
36 *       cam_ui_effect_utils_set_zoom_effect at same time.\r
37 */\r
38 \r
39 Elm_Transit * cam_ui_effect_utils_get_zoom_effect()\r
40 {\r
41         return zoom_transit_effect;\r
42 }\r
43 \r
44 void cam_ui_effect_utils_stop_zoom_effect()\r
45 {\r
46         if (zoom_transit_effect) {\r
47                 elm_transit_del(zoom_transit_effect);\r
48                 zoom_transit_effect = NULL;\r
49         }\r
50 }\r
51 \r
52 void cam_ui_effect_utils_set_zoom_effect(Evas_Object *obj, float from_rate, float to_rate, double duration)\r
53 {\r
54         Evas_Object *layout =  obj;\r
55 \r
56         if (layout == NULL)\r
57                 return;\r
58         /*Zoom in/out to scale to_rate/from_rate.*/\r
59         if (zoom_transit_effect) {\r
60                 elm_transit_del(zoom_transit_effect);\r
61                 zoom_transit_effect = NULL;\r
62         }\r
63         zoom_transit_effect = elm_transit_add();\r
64         if (zoom_transit_effect == NULL)\r
65                 return;\r
66         if (to_rate < from_rate)\r
67                 __focus_zoom_origin_state = TRUE;\r
68         else\r
69                 __focus_zoom_origin_state = FALSE;\r
70         elm_transit_object_add(zoom_transit_effect, layout);\r
71         elm_transit_effect_zoom_add(zoom_transit_effect, from_rate, to_rate);\r
72         elm_transit_duration_set(zoom_transit_effect, duration);\r
73         elm_transit_objects_final_state_keep_set(zoom_transit_effect, EINA_TRUE);\r
74         elm_transit_del_cb_set(zoom_transit_effect, __zoom_effect_transit_del_cb, NULL);\r
75         elm_transit_go(zoom_transit_effect);\r
76 \r
77 }\r
78 \r
79 void cam_ui_effect_utils_set_zoom_inout_effect(Evas_Object *obj, float from_rate, float to_rate, double duration)\r
80 {\r
81         Evas_Object *layout =  obj;\r
82 \r
83         if (layout == NULL)\r
84                 return;\r
85         /*Zoom out to scale */\r
86         Elm_Transit *transit = elm_transit_add();\r
87         elm_transit_object_add(transit, layout);\r
88         elm_transit_effect_zoom_add(transit, from_rate, to_rate);\r
89         elm_transit_duration_set(transit, duration);\r
90 \r
91         /*Zoom in to be original size.*/\r
92         Elm_Transit *transit2 = elm_transit_add();\r
93         elm_transit_object_add(transit2, layout);\r
94         elm_transit_effect_zoom_add(transit2, to_rate, from_rate);\r
95         elm_transit_duration_set(transit2, duration);\r
96 \r
97         elm_transit_chain_transit_add(transit, transit2);\r
98         elm_transit_go(transit);\r
99 \r
100 }\r
101 \r
102 \r
103 /*for thumnail animation start*/\r
104 /*note: init custom effect memory*/\r
105 static Elm_Transit_Effect * __cam_ui_effect_custom_context_new(Evas_Coord from_w,\r
106                                                                         Evas_Coord from_h,\r
107                                                                         Evas_Coord to_w,\r
108                                                                         Evas_Coord to_h\r
109                                                                         )\r
110 {\r
111         struct cam_ui_effect_custom_effect *custom_effect = calloc( 1, sizeof( struct cam_ui_effect_custom_effect ) );\r
112         if (!custom_effect) return NULL;\r
113 \r
114         custom_effect->from.w = from_w;\r
115         custom_effect->from.h = from_h;\r
116         custom_effect->to.w = to_w - from_w;\r
117         custom_effect->to.h = to_h - from_h;\r
118         return custom_effect;\r
119 }\r
120 \r
121 /*note: free custom effect memory*/\r
122 static void __cam_ui_effect_custom_context_free(Elm_Transit_Effect *effect, Elm_Transit *transit)\r
123 {\r
124         struct cam_ui_effect_custom_effect *custom_effect = effect;\r
125         free(custom_effect);\r
126         custom_effect = NULL;\r
127 }\r
128 \r
129 /*note: implement the effect solution, you could write new effect, by change these function*/\r
130 static void __cam_ui_effect_custom_op(Elm_Transit_Effect *effect, Elm_Transit *transit, double progress)\r
131 {\r
132         if (!effect) return;\r
133 \r
134         Evas_Coord w, h;\r
135         Evas_Object *obj;\r
136         const Eina_List *elist;\r
137 \r
138         struct cam_ui_effect_custom_effect *custom_effect = (struct cam_ui_effect_custom_effect *) effect;\r
139         const Eina_List *objs = elm_transit_objects_get(transit);\r
140 \r
141         if (progress < 0.5) {\r
142                 h = custom_effect->from.h + (custom_effect->to.h * progress * 2);\r
143                 w = custom_effect->from.w;\r
144         } else {\r
145                 h = custom_effect->from.h + custom_effect->to.h;\r
146                 w = custom_effect->from.w + (custom_effect->to.w * (progress - 0.5) * 2);\r
147         }\r
148         EINA_LIST_FOREACH(objs, elist, obj) {\r
149                 if (obj) {\r
150                         evas_object_resize(obj, w, h);\r
151                 }\r
152         }\r
153 \r
154 }\r
155 \r
156 /*note: when transit effect end, before transit del, this fuction will be called*/\r
157 static void __cam_ui_effect_utils_transit_del_cb(void *data, Elm_Transit *transit)\r
158 {\r
159         Evas_Object *obj = (Evas_Object *)data;\r
160         DEBUG_TRACE("");\r
161         if (obj) {\r
162                 DEBUG_TRACE("");\r
163                 struct appdata *ad = (struct appdata *)cam_appdata_get();\r
164                 if (!ad)\r
165                         return;\r
166                 if (!ad->toolbar.quickview_item.edje) {\r
167                         DEL_EVAS_OBJECT(ad->toolbar.quickview_item.thumbnail_image);\r
168                         DEL_EVAS_OBJECT(obj);\r
169                         return;\r
170                 }\r
171                 DEL_EVAS_OBJECT(ad->toolbar.quickview_item.thumbnail_image);\r
172                 ad->toolbar.quickview_item.thumbnail_image = obj;\r
173                 elm_object_part_content_set(ad->toolbar.quickview_item.edje,\r
174                                         "thumbnail", ad->toolbar.quickview_item.thumbnail_image);\r
175         }\r
176 }\r
177 \r
178 void cam_ui_effect_utils_set_thumbnail_effect(Evas_Object *obj,\r
179                                                                 Evas_Coord x,\r
180                                                                 Evas_Coord y,\r
181                                                                 Evas_Coord w,\r
182                                                                 Evas_Coord h,\r
183                                                                 double duration)\r
184 {\r
185         Evas_Object *layout = obj;\r
186         Elm_Transit_Effect *effect_context = __cam_ui_effect_custom_context_new(0, h, w, h);\r
187 \r
188         Elm_Transit *transit = elm_transit_add();\r
189         elm_transit_object_add(transit, layout);\r
190         elm_transit_tween_mode_set(transit, ELM_TRANSIT_TWEEN_MODE_LINEAR);\r
191         elm_transit_effect_add(transit, __cam_ui_effect_custom_op, effect_context, __cam_ui_effect_custom_context_free);\r
192 \r
193         elm_transit_objects_final_state_keep_set(transit,  TRUE);\r
194         elm_transit_duration_set(transit, duration);\r
195         elm_transit_del_cb_set(transit, __cam_ui_effect_utils_transit_del_cb, (void *)obj);\r
196         elm_transit_go(transit);\r
197 }\r
198 /*for thumbnail antimation end*/\r
199 //end file\r