2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.1 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://floralicense.org/license/
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include "cam_zoom_edc_callback.h"
20 #include "cam_capacity_type.h"
21 #include "cam_device_capacity.h"
24 #define ZOOM_DESTROY_TIME 3.0
27 static Evas_Object *slider = NULL;
28 static Ecore_Timer *zoom_destroy_timer = NULL;
29 static int zoom_value[CAM_ZOOM_VALUE_MAX] = { 0 };
31 static gboolean __init_zoom_value(struct appdata *ad);
32 static Eina_Bool __zoom_destroy_timer_cb(void *data);
33 static void __set_zoom_value(struct appdata *data, int zoom_level);
34 static void __zoom_slider_stop_cb(void *data, Evas_Object *obj, void *event_info);
35 static void __zoom_slider_changed_cb(void *data, Evas_Object *obj, void *event_info);
36 static void __set_gauge_focus(struct appdata *data);
39 static gboolean __init_zoom_value(struct appdata *ad)
41 cam_retvm_if(ad == NULL, FALSE, "appdata is NULL");
42 CamAppData *camapp = ad->camapp_handle;
43 cam_retvm_if(camapp == NULL, FALSE, "camapp_handle is NULL");
46 double gap = (double)(camapp->zoom_max - camapp->zoom_min) / (CAM_ZOOM_VALUE_MAX - 2);
47 for (i = 2; i < CAM_ZOOM_VALUE_MAX - 1; i++) {
48 zoom_value[i] = (int)(0.5 + camapp->zoom_min + (i - 1) * gap);
49 DEBUG_TRACE("zoom_value[%d] =%d", i, zoom_value[i]);
51 zoom_value[1] = camapp->zoom_min;
52 DEBUG_TRACE("zoom_value[%d] =%d", 1, zoom_value[1]);
53 zoom_value[CAM_ZOOM_VALUE_MAX - 1] = camapp->zoom_max;
54 DEBUG_TRACE("zoom_value[%d] =%d", (CAM_ZOOM_VALUE_MAX - 1), zoom_value[CAM_ZOOM_VALUE_MAX - 1]);
59 static Eina_Bool __zoom_destroy_timer_cb(void *data)
63 struct appdata *ad = (struct appdata *)data;
64 cam_retvm_if(ad == NULL, ECORE_CALLBACK_CANCEL, "appdata is NULL");
68 if (zoom_destroy_timer)
69 zoom_destroy_timer = NULL;
71 return ECORE_CALLBACK_CANCEL;
74 static void __set_zoom_value(struct appdata *data, int zoom_level)
76 struct appdata *ad = (struct appdata *)data;
77 cam_retm_if(ad == NULL, "appdata is NULL");
78 CamAppData *camapp = ad->camapp_handle;
79 cam_retm_if(camapp == NULL, "camapp_handle is NULL");
82 GValue value = { 0, };
84 camapp->zoom_mode = zoom_level;
86 zoom = zoom_value[camapp->zoom_mode];
87 DEBUG_TRACE("zoom_value =%d", zoom);
88 CAM_GVALUE_SET_INT(value, zoom);
90 if (!cam_handle_value_set(ad, PROP_ZOOM, &value)) {
91 cam_critical(LOG_CAM, "cam_handle_value_set failed");
95 static void __zoom_slider_stop_cb(void *data, Evas_Object *obj, void *event_info)
97 struct appdata *ad = (struct appdata *)data;
98 cam_retm_if(ad == NULL, "appdata is NULL");
102 Evas_Object *slider = (Evas_Object *)obj;
103 int slider_value = (int)elm_slider_value_get(slider);
104 elm_slider_value_set(slider, slider_value);
105 __set_zoom_value(ad, slider_value);
107 cam_critical(LOG_UI, "Error : slider is NULL");
110 if(zoom_destroy_timer)
111 ecore_timer_reset(zoom_destroy_timer);
114 static void __zoom_slider_changed_cb(void *data, Evas_Object *obj, void *event_info)
116 struct appdata *ad = (struct appdata *)data;
117 cam_retm_if(ad == NULL, "appdata is NULL");
120 Evas_Object *slider = (Evas_Object *)obj;
121 int slider_value = (int)elm_slider_value_get(slider);
122 DEBUG_TRACE("slider_value:%d", slider_value);
123 __set_zoom_value(ad, slider_value);
125 cam_critical(LOG_UI, "Error : slider is NULL");
128 if(zoom_destroy_timer)
129 ecore_timer_reset(zoom_destroy_timer);
132 gboolean load_zoom_edje(struct appdata *ad)
134 DEBUG_TRACE("START");
136 cam_retvm_if(ad == NULL, FALSE, "appdata is NULL");
137 CamAppData *camapp = ad->camapp_handle;
138 cam_retvm_if(camapp == NULL, FALSE, "camapp_handle is NULL");
140 elm_object_part_content_unset(ad->ug_base, "zoom_layout");
142 cam_zoom_unload_edje(ad);
145 gboolean portrait = FALSE;
146 gboolean slider_inverse = FALSE;
147 switch (ad->target_direction) {
148 case CAM_TARGET_DIRECTION_LANDSCAPE:
149 ad->zoom_edje = cam_app_load_edj(ad->ug_base, CAM_ZOOM_EDJ_NAME, GRP_MAIN);
151 slider_inverse = TRUE;
153 case CAM_TARGET_DIRECTION_LANDSCAPE_INVERSE:
154 ad->zoom_edje = cam_app_load_edj(ad->ug_base, CAM_ZOOM_EDJ_INVERSE_NAME, GRP_MAIN);
156 slider_inverse = FALSE;
158 case CAM_TARGET_DIRECTION_PORTRAIT:
159 ad->zoom_edje = cam_app_load_edj(ad->ug_base, CAM_ZOOM_EDJ_VERTICAL_NAME, GRP_MAIN);
161 slider_inverse = FALSE;
163 case CAM_TARGET_DIRECTION_PORTRAIT_INVERSE:
164 ad->zoom_edje = cam_app_load_edj(ad->ug_base, CAM_ZOOM_EDJ_VERTICAL_INVERSE_NAME, GRP_MAIN);
165 slider_inverse = TRUE;
169 DEBUG_TRACE("wow, reached un-able reached codes");
172 cam_retvm_if(ad->zoom_edje == NULL, FALSE, "zom_edje is NULL");
173 elm_object_part_content_set(ad->ug_base, "zoom_layout", ad->zoom_edje);
176 if (!ad->zoom_text_min_edje) {
177 ad->zoom_text_min_edje = (Evas_Object *)edje_object_part_object_get(_EDJ(ad->zoom_edje), "text_min");
179 cam_retvm_if(ad->zoom_text_min_edje == NULL, FALSE, "zoom_text_min is NULL");
181 if (!ad->zoom_text_max_edje) {
182 ad->zoom_text_max_edje = (Evas_Object *)edje_object_part_object_get(_EDJ(ad->zoom_edje), "text_max");
184 cam_retvm_if(ad->zoom_text_max_edje == NULL, FALSE, "zoom_text_max is NULL");
186 edje_object_part_text_set(_EDJ(ad->zoom_edje), "text_min", "x1");
187 edje_object_part_text_set(_EDJ(ad->zoom_edje), "text_max", "x4");
190 slider = elm_slider_add(ad->zoom_edje);
191 cam_retvm_if(slider == NULL, FALSE, "slider is NULL");
193 elm_object_style_set(slider, "camera");
195 elm_slider_horizontal_set(slider, EINA_TRUE);
197 elm_slider_horizontal_set(slider, EINA_FALSE);
199 if (slider_inverse) {
200 elm_slider_inverted_set(slider, EINA_TRUE);
202 elm_slider_inverted_set(slider, EINA_FALSE);
204 elm_slider_min_max_set(slider, CAM_ZOOM_VALUE_MIN + 1, CAM_ZOOM_VALUE_MAX - 1);
207 elm_slider_value_set(slider, camapp->zoom_mode);
209 int slider_value = (int)elm_slider_value_get(slider);
210 DEBUG_TRACE("slider_value:%d / camapp->zoom_mode:%d", slider_value, camapp->zoom_mode);
212 evas_object_size_hint_align_set(slider, EVAS_HINT_FILL, EVAS_HINT_FILL);
213 evas_object_size_hint_weight_set(slider, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
214 elm_object_part_content_set(ad->zoom_edje, "slider", slider);
216 evas_object_smart_callback_del(slider, "slider,drag,stop", __zoom_slider_stop_cb);
217 evas_object_smart_callback_add(slider, "slider,drag,stop", __zoom_slider_stop_cb, (void*)ad);
218 evas_object_smart_callback_del(slider, "changed", __zoom_slider_changed_cb);
219 evas_object_smart_callback_add(slider, "changed", __zoom_slider_changed_cb, (void*)ad);
224 gboolean update_zoom_edje(struct appdata *ad)
226 DEBUG_TRACE("START");
228 cam_retvm_if(ad == NULL, FALSE, "appdata is NULL");
229 CamAppData *camapp = ad->camapp_handle;
230 cam_retvm_if(camapp == NULL, FALSE, "camapp_handle is NULL");
232 cam_retvm_if(ad->zoom_edje == NULL, FALSE, "zom_edje is NULL");
233 cam_retvm_if(slider == NULL, FALSE, "zoom slider is NULL");
235 elm_slider_value_set(slider, camapp->zoom_mode);
240 gboolean unload_zoom_edje(struct appdata *ad)
242 cam_retvm_if(ad == NULL, FALSE, "appdata is NULL");
244 cam_reset_focus_mode(ad);
246 DEL_EVAS_OBJECT(ad->zoom_text_min_edje);
247 DEL_EVAS_OBJECT(ad->zoom_text_max_edje);
248 DEL_EVAS_OBJECT(ad->zoom_edje);
249 REMOVE_TIMER(zoom_destroy_timer);
254 gboolean zoom_in(struct appdata *ad, gboolean is_zoom_in, int zoom_gap)
256 CamAppData *camapp = NULL;
257 cam_retvm_if(ad == NULL, FALSE, "appdata is NULL");
258 camapp = ad->camapp_handle;
259 cam_retvm_if(camapp == NULL, FALSE, "camapp_handle is NULL");
262 unsigned int capacity = 0;
264 GetCamDevFuncCaps(&capacity, ad);
265 if (!(capacity & CAM_CP_FUNC_ZOOM)) {
266 DEBUG_TRACE("Zoom is not supported");
270 REMOVE_TIMER(zoom_destroy_timer);
272 __init_zoom_value(ad);
275 zoom_value = camapp->zoom_mode;
278 if (zoom_value < CAM_ZOOM_VALUE_MAX - 1)
279 zoom_value += zoom_gap;
281 if (zoom_value > CAM_ZOOM_VALUE_MIN + 1)
282 zoom_value -= zoom_gap;
284 DEBUG_TRACE("zoom_value = %d", zoom_value);
286 __set_zoom_value(ad, zoom_value);
288 if (ad->zoom_edje == NULL)
291 update_zoom_edje(ad);
293 zoom_destroy_timer = ecore_timer_add(ZOOM_DESTROY_TIME, __zoom_destroy_timer_cb, ad);
298 void cam_zoom_create_pinch_edje(struct appdata *data)
300 struct appdata *ad = (struct appdata *)data;
301 cam_retm_if(ad == NULL, "appdata is NULL");
303 if (ad->pinch_edje) {
304 evas_object_del(ad->pinch_edje);
305 ad->pinch_edje = NULL;
308 elm_object_part_content_unset(ad->ug_base, "pinch_layout");
310 switch (ad->target_direction) {
311 case CAM_TARGET_DIRECTION_LANDSCAPE:
312 case CAM_TARGET_DIRECTION_LANDSCAPE_INVERSE:
313 ad->pinch_edje = cam_app_load_edj(ad->ug_base, CAM_ZOOM_EDJ_NAME, "pinch");
315 case CAM_TARGET_DIRECTION_PORTRAIT:
316 case CAM_TARGET_DIRECTION_PORTRAIT_INVERSE:
317 ad->pinch_edje = cam_app_load_edj(ad->ug_base, CAM_ZOOM_EDJ_VERTICAL_NAME, "pinch");
320 DEBUG_TRACE("error target direction!");
324 cam_retm_if(ad->pinch_edje == NULL, "pinch_edje is NULL");
325 elm_object_part_content_set(ad->ug_base, "pinch_layout", ad->pinch_edje);
327 __set_gauge_focus(ad);
328 __init_zoom_value(ad);
331 static void __set_gauge_focus(struct appdata *data)
333 struct appdata *ad = (struct appdata *)data;
334 CamAppData *camapp = NULL;
335 cam_retm_if(ad == NULL, "appdata is NULL");
336 camapp = ad->camapp_handle;
337 cam_retm_if(camapp == NULL, "camapp_handle is NULL");
339 DEBUG_TRACE("camapp->zoom_mode %d", camapp->zoom_mode);
341 char part_name[CAM_ZOOM_VALUE_MAX + 1][128] = {
342 {"set.pinch.default"},
343 {"set.pinch.default"},
377 if ((camapp->zoom_mode >= CAM_ZOOM_VALUE_MIN)
378 &&(camapp->zoom_mode <= CAM_ZOOM_VALUE_MAX)) {
379 elm_object_signal_emit(ad->pinch_edje, part_name[camapp->zoom_mode], "prog");
381 DEBUG_TRACE("NOTE: error zoom mode");
384 evas_object_show(ad->pinch_edje);
387 gboolean cam_pinch_zoom_in(struct appdata* ad,gboolean is_zoom_in,int zoom_value)
389 CamAppData *camapp = NULL;
390 cam_retvm_if(ad == NULL, FALSE, "appdata is NULL");
391 camapp = ad->camapp_handle;
392 cam_retvm_if(camapp == NULL, FALSE, "camapp_handle is NULL");
394 unsigned int capacity = 0;
396 GetCamDevFuncCaps(&capacity, ad);
397 if (!(capacity & CAM_CP_FUNC_ZOOM)) {
398 DEBUG_TRACE("Zoom is not supported");
403 if (camapp->zoom_mode < CAM_ZOOM_VALUE_MAX - 1) {
404 camapp->zoom_mode = camapp->zoom_mode + zoom_value;
407 if (camapp->zoom_mode > CAM_ZOOM_VALUE_MIN + 1) {
408 camapp->zoom_mode = camapp->zoom_mode - zoom_value;
412 __set_gauge_focus(ad);
413 __set_zoom_value(ad, camapp->zoom_mode);