2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.0 (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://www.tizenopensource.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.
17 #include <Elementary.h>
19 #include "ivug-setas-view-callerid.h"
20 #include "ivug-setas-view.h"
22 #include "ivug-selectioninfo.h"
24 #include "ivug-image.h"
27 #include "ivug-scissorbox.h"
29 #define EDJ_PATH PREFIX"/res/edje/"PACKAGE
31 #define SETAS_EDJ_FILE EDJ_PATH"/ivug-setas.edj"
33 #define CLICK_TIME_MAX (500) // click time.
34 #define CLICK_WIDTH_MIN (elm_config_finger_size_get() >> 1) //click width, if mouse move under this value and under click time, it is click.
35 #define CLICK_INTERVAL_TIME 0.15
37 /* it is temp define, because scroll, scroll,anim,end is called earlyer.
38 So find bound of scissor box again after SETAS_INTERVAL_TIME */
39 #define SETAS_INTERVAL_TIME 0.1
40 #define SETAS_INTERVAL_TIME_FIRST_LOAD 0.3
42 #define POPUP_ICON_DIRECTORY_PATH IMAGE_PATH"/Popup_icon"
44 #define CONTROL_ICON_DIRECTORY_PATH IMAGE_PATH"/01_Control icon"
45 #define ICON_PATH_SAVE CONTROL_ICON_DIRECTORY_PATH"/T01_controlbar_icon_save.png"
46 #define ICON_PATH_PREV CONTROL_ICON_DIRECTORY_PATH"/00_winset_btn_prev.png"
50 Evas_Object *btn_layout; // ????
52 Evas_Object *photocam;
56 Elm_Object_Item *btn_ok;
57 Elm_Object_Item *btn_cancel;
59 bool bShowMenu; // Current state for button's visibility
69 Eina_Bool bAspectPreserve;
75 #define SETAS_DATA(obj) \
76 (TSetAsData *)evas_object_data_get((Evas_Object *)(obj), "pSetAsData")
81 _ConvertARGB888toY(unsigned char* pBuf, unsigned char* pGrayBuf, int width, int height)
84 User should malloc output buffer
86 unsigned char* pSrc = (unsigned char*) pBuf;
87 unsigned char* pDSt = (unsigned char*) pGrayBuf;
89 unsigned char* pEnd = pDSt + height * width;
93 pSrc++; // throw Alpaha value
95 unsigned long r = *pSrc++;
96 unsigned long g = *pSrc++;
97 unsigned long b = *pSrc++;
99 *pDSt++ = (308 * r + 600 * g + 116 * b) >> 10;
103 static void _put_scissorbox(Evas_Object *obj)
105 TSetAsData *pSetAsData = SETAS_DATA(obj);
107 Evas_Object *image = ivug_image_internal_image_get(pSetAsData->photocam);
109 Evas_Coord_Rectangle rect;
114 double ratio = pSetAsData->crop.ratio;
116 ivug_image_image_size_get(pSetAsData->photocam, &image_w, &image_h); // Get original image size.
119 ivug_image_region_get(pSetAsData->photocam, &px, &py, &pw, &ph);
123 if ( image_w > image_h ) // Landscape image
125 if(ratio > 1.0) // height is larger
127 iw = image_h / (2 * ratio);
133 ih = (image_h * ratio) / 2;
138 if(ratio > 1.0) // height is larger
140 iw = image_w / (2 * ratio);
146 ih = (image_w * ratio) / 2;
150 ix = (image_w - iw)/2;
151 iy = (image_h - ih)/2;
154 rect.x = (double)ix * pw / image_w + px;
155 rect.y = (double)iy * ph / image_h + py;
157 rect.w = (double)iw * pw / image_w;
158 rect.h = (double)ih * ph / image_h;
160 MSG_SETAS_WARN("Zoom Put Box in LCD XYWH(%d,%d,%d,%d)",
161 rect.x, rect.y, rect.w, rect.h);
163 ivug_scissorbox_region_set(pSetAsData->crop.box, rect.x, rect.y, rect.w, rect.h);
167 ivug_scissorbox_attach(pSetAsData->crop.box, image); // Attach to photocam
172 _on_btn_ok_clicked(void *data, Evas_Object *obj, void *event_info)
174 TSetAsData *pSetAsData = SETAS_DATA(data);
175 IV_ASSERT(pSetAsData != NULL);
177 MSG_SETAS_HIGH("OK button clicked");
180 edje_object_signal_callback_del(_EDJ(pSetAsData->btn_layout),
181 "setasview,set,clicked",
185 evas_object_smart_callback_call(pSetAsData->layout, "ok,clicked", NULL);
187 if ( pSetAsData->crop.box )
189 evas_object_del(pSetAsData->crop.box);
190 pSetAsData->crop.box = NULL;
197 _on_btn_cancel_clicked(void *data, Evas_Object *obj, void *event_info)
199 TSetAsData *pSetAsData = SETAS_DATA(data);
200 IV_ASSERT(pSetAsData != NULL);
202 MSG_SETAS_HIGH("Cancel button clicked");
203 evas_object_smart_callback_call(pSetAsData->layout, "cancel,clicked", NULL);
205 if ( pSetAsData->crop.box )
207 evas_object_del(pSetAsData->crop.box);
208 pSetAsData->crop.box = NULL;
211 // _ivug_setas_view_remove(pSetAsData);
214 static Eina_Bool _on_detect_expired(void *data)
216 ivug_retv_if(!data, ECORE_CALLBACK_CANCEL);
218 TSetAsData *pSetAsData = SETAS_DATA(data);
220 pSetAsData->timer = NULL;
222 _put_scissorbox(pSetAsData->layout);
224 elm_object_item_disabled_set(pSetAsData->btn_ok, EINA_FALSE);
226 evas_object_smart_callback_call(pSetAsData->layout, "loaded", NULL);
228 pSetAsData->notify = ivug_notify_create(pSetAsData->layout, IDS_CALLER_ID_NOTIFY);
230 return ECORE_CALLBACK_CANCEL;
235 _on_photocam_loaded(void *data, Evas_Object *obj, void *event_info)
237 TSetAsData *pSetAsData = SETAS_DATA(data);
238 MSG_SETAS_HIGH("Photocam preloaded");
240 typedef enum _Evas_Load_Error
242 EVAS_LOAD_ERROR_NONE = 0, /**< No error on load */
243 EVAS_LOAD_ERROR_GENERIC = 1, /**< A non-specific error occurred */
244 EVAS_LOAD_ERROR_DOES_NOT_EXIST = 2, /**< File (or file path) does not exist */
245 EVAS_LOAD_ERROR_PERMISSION_DENIED = 3, /**< Permission deinied to an existing file (or path) */
246 EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED = 4, /**< Allocation of resources failure prevented load */
247 EVAS_LOAD_ERROR_CORRUPT_FILE = 5, /**< File corrupt (but was detected as a known format) */
248 EVAS_LOAD_ERROR_UNKNOWN_FORMAT = 6 /**< File is not a known format */
249 } Evas_Load_Error; /**< Load error you can get from loading of files - see evas_load_error_str() too */
252 // Evas_Load_Error error = static_cast<Evas_Load_Error>((int)event_info);
253 Evas_Load_Error error = evas_object_image_load_error_get(ivug_image_internal_image_get(obj));
255 if ( error != EVAS_LOAD_ERROR_NONE )
257 MSG_SETAS_ERROR("Error occured during decoding. Error=%d", error);
259 if ( error == EVAS_LOAD_ERROR_UNKNOWN_FORMAT )
261 evas_object_smart_callback_call(pSetAsData->layout, "load,failed", (void *)SETAS_ERROR_TYPE_UNKNOWN_FORMAT);
263 else if ( error == EVAS_LOAD_ERROR_PERMISSION_DENIED )
265 evas_object_smart_callback_call(pSetAsData->layout, "load,failed", (void *)SETAS_ERROR_TYPE_PERMISSION_DENIED);
269 evas_object_smart_callback_call(pSetAsData->layout, "load,failed", (void *)SETAS_ERROR_TYPE_INVALID_FILE);
276 Evas_Object *object = elm_object_part_content_unset(pSetAsData->layout, "setasview.thumbnail");
279 evas_object_del(object);
282 MSG_SETAS_HIGH("Photocam loaded.");
284 pSetAsData->timer = ecore_timer_add(0.5, _on_detect_expired, data);
288 static void _on_moved(void *data, Evas *e, Evas_Object *obj, void *event_info)
290 // TSetAsData *pSetAsData = SETAS_DATA(data);
294 static void _on_resized(void *data, Evas *e, Evas_Object *obj, void *event_info)
296 TSetAsData *pSetAsData = SETAS_DATA(data);
297 ///////////////////////////////////////////////////////////////////
298 int org_x, org_y, org_w, org_h;
300 ivug_image_region_get(pSetAsData->photocam, &org_x, &org_y, &org_w, &org_h);
302 if(org_w == 0 || org_h == 0)
305 MSG_SETAS_MED("org_x=%d, org_y=%d, org_w=%d, org_h=%d", org_x, org_y, org_w, org_h);
307 int org_sx, org_sy, org_sw, org_sh;
308 ivug_scissorbox_region_get(pSetAsData->crop.box, &org_sx, &org_sy, &org_sw, &org_sh);
310 MSG_SETAS_MED("org_sx=%d, org_sy=%d, org_sw=%d, org_sh=%d", org_sx, org_sy, org_sw, org_sh);
312 int dx = org_sx-org_x;
313 int dy = org_sy-org_y;
315 int lcd_x, lcd_y, lcd_w, lcd_h;
317 evas_object_geometry_get(obj, &lcd_x, &lcd_y, &lcd_w, &lcd_h);
318 MSG_SETAS_MED("lcd_x=%d, lcd_y=%d, lcd_w=%d, lcd_h=%d", lcd_x, lcd_y, lcd_w, lcd_h);
330 ph = (img_h * ext_w) / img_w;
334 pw = (img_w * ext_h) / img_h;
346 zoom = (double)pw / img_w;
350 zoom = (double)ph / img_h;
360 sx = (ext_w-img_w*zoom)/2 + dx;
361 sy = (ext_h-img_h*zoom)/2 + dy;
363 ivug_scissorbox_boundary_set(pSetAsData->crop.box, (ext_w-img_w*zoom)/2, (ext_h-img_h*zoom)/2, img_w*zoom, img_h*zoom);
365 ///////////////////////////////////////////////////////////////////
367 MSG_SETAS_MED("sx=%d, sy=%d, sw=%d, sh=%d", sx, sy, sw, sh);
369 ivug_scissorbox_region_set(pSetAsData->crop.box, sx, sy, sw, sh);
372 static void _on_removed(void *data, Evas *e, Evas_Object *obj, void *event_info)
374 TSetAsData *pSetAsData = SETAS_DATA(data);
376 MSG_SETAS_HIGH("Remoing SetAsData");
378 if(pSetAsData->timer)
380 ecore_timer_del(pSetAsData->timer);
381 pSetAsData->timer = NULL;
384 if(pSetAsData->notify)
386 evas_object_del(pSetAsData->notify);
387 pSetAsData->notify = NULL;
390 if(pSetAsData->crop.box)
392 evas_object_del(pSetAsData->crop.box);
393 pSetAsData->crop.box = NULL;
396 if(pSetAsData->photocam)
398 evas_object_del(pSetAsData->photocam);
399 pSetAsData->photocam = NULL;
402 if(pSetAsData->drm_filepath)
404 ivug_remove_file(pSetAsData->drm_filepath);
405 free(pSetAsData->drm_filepath);
406 pSetAsData->drm_filepath = NULL;
413 static Evas_Event_Flags _finger_tap_end(void *data , void *event_info)
415 Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
417 MSG_SETAS_HIGH("Finger tab end. evt=%d", p->timestamp);
419 if ( p->n != 1 ) return EVAS_EVENT_FLAG_NONE;
421 TSetAsData *pSetAsData = (TSetAsData *)data;
422 IV_ASSERT(pSetAsData != NULL);
424 if(pSetAsData->bShowMenu)
426 MSG_SETAS_HIGH("Hide");
427 elm_win_indicator_mode_set((Evas_Object*)ug_get_window(), ELM_WIN_INDICATOR_HIDE);
428 evas_object_hide(pSetAsData->notify);
429 edje_object_signal_emit(_EDJ(pSetAsData->btn_layout), "elm,state,hide", "event");
433 MSG_SETAS_HIGH("Show");
434 elm_win_indicator_mode_set((Evas_Object*)ug_get_window(), ELM_WIN_INDICATOR_SHOW);
435 evas_object_show(pSetAsData->notify);
436 edje_object_signal_emit(_EDJ(pSetAsData->btn_layout), "elm,state,show", "event");
439 pSetAsData->bShowMenu = !pSetAsData->bShowMenu;
441 return EVAS_EVENT_FLAG_NONE;
444 void _add_gesture_layer(Evas_Object *parent, TSetAsData *pSetAsData)
446 IV_ASSERT(pSetAsData != NULL);
448 Evas_Object *gesture = pSetAsData->gesture;
450 gesture = elm_gesture_layer_add(parent);
451 elm_gesture_layer_hold_events_set(gesture, EINA_TRUE);
453 elm_gesture_layer_cb_set(gesture, ELM_GESTURE_N_TAPS, ELM_GESTURE_STATE_END, _finger_tap_end, (void *)pSetAsData);
455 if ( elm_gesture_layer_attach(gesture, pSetAsData->photocam) == EINA_FALSE)
457 MSG_SETAS_ERROR("Cannot attach event rect");
460 evas_object_name_set(gesture, "CallerID:Getsture");
463 Evas_Object *_ivug_setas_callerid_create_layout(Evas_Object *parent)
465 TSetAsData *pSetAsData = (TSetAsData *)calloc(1, sizeof(TSetAsData));
467 if ( pSetAsData == NULL )
469 MSG_SETAS_ERROR("Cannot alloc pSetasData");
473 Elm_Object_Item *item[4];
474 Evas_Object *controlbar = NULL;
476 pSetAsData->layout = ivug_layout_add(parent , SETAS_EDJ_FILE, "setas_view");
477 if ( pSetAsData->layout == NULL )
479 MSG_SETAS_ERROR("Cannot create layout.");
482 evas_object_event_callback_add(pSetAsData->layout, EVAS_CALLBACK_MOVE, _on_moved, pSetAsData->layout);
483 evas_object_event_callback_add(pSetAsData->layout, EVAS_CALLBACK_RESIZE, _on_resized, pSetAsData->layout);
485 pSetAsData->crop.box = ivug_scissorbox_add(pSetAsData->layout);
487 if ( pSetAsData->crop.box == NULL )
489 MSG_SETAS_ERROR("Cannot create layout.");
493 evas_object_smart_member_add(pSetAsData->crop.box, pSetAsData->layout);
495 pSetAsData->btn_layout = ivug_layout_add(pSetAsData->layout , SETAS_EDJ_FILE, "setas_view_btn");
496 if ( pSetAsData->btn_layout == NULL )
498 MSG_SETAS_ERROR("Cannot create btn_layout.");
501 evas_object_smart_member_add(pSetAsData->btn_layout, pSetAsData->layout);
504 Evas_Object *photocam;
505 photocam = ivug_image_create(pSetAsData->layout);
506 ivug_image_animated_set(photocam, EINA_FALSE); // Show first frame only when AGIF
507 ivug_image_hold_set(photocam , EINA_TRUE); // Disable mouse events
509 evas_object_name_set(photocam, "setas_photocam");
511 evas_object_smart_callback_add(photocam, "loaded", _on_photocam_loaded, (void *)pSetAsData->layout);
512 elm_object_part_content_set(pSetAsData->layout, "setasview.photocam", photocam);
513 evas_object_show(photocam);
515 pSetAsData->photocam = photocam;
517 pSetAsData->bShowMenu = true;
518 _add_gesture_layer(pSetAsData->layout, pSetAsData);
520 controlbar = ivug_controlbar_add(pSetAsData->layout, "default");
522 item[0] = elm_toolbar_item_append(controlbar, ICON_PATH_SAVE, NULL, _on_btn_ok_clicked, (void *)pSetAsData->layout);
523 item[1] = elm_toolbar_item_append(controlbar, NULL, NULL, NULL, NULL);
524 item[2] = elm_toolbar_item_append(controlbar, NULL, NULL, NULL, NULL);
525 item[3] = elm_toolbar_item_append(controlbar, ICON_PATH_PREV, NULL, _on_btn_cancel_clicked, (void *)pSetAsData->layout);
527 elm_object_item_disabled_set(item[1], EINA_TRUE);
528 elm_object_item_disabled_set(item[2], EINA_TRUE);
530 elm_object_part_content_set(pSetAsData->btn_layout, "controlbar", controlbar);
532 //Evas_Object *back_btn = ivug_button_add(controlbar, "naviframe/end_btn/default", IDS_BACK, NULL, _on_btn_cancel_clicked, pSetAsData->layout);
534 //elm_object_part_content_set(pSetAsData->btn_layout, "elm.swallow.prev_btn", back_btn);
536 evas_object_smart_member_add(pSetAsData->btn_layout, pSetAsData->layout);
538 pSetAsData->btn_ok = item[0];
539 pSetAsData->btn_cancel = item[3];
540 elm_object_item_disabled_set(pSetAsData->btn_ok, EINA_TRUE);
542 MSG_SETAS_HIGH("Create setas layout");
544 evas_object_data_set( pSetAsData->layout, "pSetAsData", pSetAsData);
545 evas_object_event_callback_add(pSetAsData->layout, EVAS_CALLBACK_DEL, _on_removed, pSetAsData->layout);
547 return pSetAsData->layout;
550 if ( pSetAsData->crop.box )
551 evas_object_del(pSetAsData->crop.box);
553 if ( pSetAsData->btn_layout )
554 evas_object_del(pSetAsData->btn_layout);
556 if ( pSetAsData->layout )
557 evas_object_del(pSetAsData->layout);
566 bool _ivug_setas_callerid_load_file(Evas_Object *obj, const char *filepath)
568 TSetAsData *pSetAsData = SETAS_DATA(obj);
570 MSG_SETAS_HIGH("Load image file : %s", filepath);
572 Evas_Load_Error error = EVAS_LOAD_ERROR_NONE;
574 if(ivug_drm_is_drm_file(filepath))
576 MSG_SETAS_HIGH("DRM File : %s", filepath);
577 error = EVAS_LOAD_ERROR_PERMISSION_DENIED;
581 error = ivug_image_file_set(pSetAsData->photocam, filepath, "noAnim");
584 if ( error != EVAS_LOAD_ERROR_NONE )
586 // TODO : What is good for error handing??????
587 MSG_SETAS_ERROR("FileSet Error=%d", error);
589 if ( error == EVAS_LOAD_ERROR_UNKNOWN_FORMAT )
591 evas_object_smart_callback_call(pSetAsData->layout, "load,failed", (void *)SETAS_ERROR_TYPE_UNKNOWN_FORMAT);
594 else if ( error == EVAS_LOAD_ERROR_PERMISSION_DENIED )
596 evas_object_smart_callback_call(pSetAsData->layout, "load,failed", (void *)SETAS_ERROR_TYPE_PERMISSION_DENIED);
601 evas_object_smart_callback_call(pSetAsData->layout, "load,failed", (void *)SETAS_ERROR_TYPE_INVALID_FILE);
611 Evas_Object *_ivug_setas_callerid_internal_image_get(Evas_Object *obj)
613 TSetAsData *pSetAsData = SETAS_DATA(obj);
615 MSG_SETAS_HIGH("Internal image get!");
617 return pSetAsData->photocam;
620 bool _ivug_setas_callerid_select_region_get(Evas_Object *obj, int *x, int *y, int *w, int *h)
622 TSetAsData *pSetAsData = SETAS_DATA(obj);
624 if ( pSetAsData->crop.box == NULL)
629 ivug_scissorbox_region_get(pSetAsData->crop.box, x, y, w, h);
635 void _ivug_setas_callerid_aspect_ratio_set(Evas_Object *obj, double ratio)
637 TSetAsData *pSetAsData = SETAS_DATA(obj);
639 pSetAsData->crop.bAspectPreserve = TRUE;
640 pSetAsData->crop.ratio = ratio;
642 ivug_scissorbox_ratio_fix( pSetAsData->crop.box, EINA_TRUE);