fix crop view gui
[apps/home/ug-image-viewer-efl.git] / main / src / view / ivug-setas-view-callerid.cpp
1 /*
2  * Copyright 2012  Samsung Electronics Co., Ltd
3  *
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
7  *
8  *        http://www.tizenopensource.org/license
9  *
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.
15  */
16
17 #include <Elementary.h>
18
19 #include "ivug-setas-view-callerid.h"
20 #include "ivug-setas-view.h"
21
22 #include "ivug-selectioninfo.h"
23
24 #include "ivug-image.h"
25 #include "ivug-drm.h"
26 #include "EFLUtil.h"
27 #include "ivug-scissorbox.h"
28
29 #define EDJ_PATH PREFIX"/res/edje/"PACKAGE
30
31 #define SETAS_EDJ_FILE EDJ_PATH"/ivug-setas.edj"
32
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
36
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
41
42 #define POPUP_ICON_DIRECTORY_PATH       IMAGE_PATH"/Popup_icon"
43
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"
47
48 typedef struct {
49         Evas_Object *layout;
50         Evas_Object *btn_layout;                // ????
51         Evas_Object *notify;
52         Evas_Object *photocam;
53
54         Evas_Object *gesture;
55
56         Elm_Object_Item *btn_ok;
57         Elm_Object_Item *btn_cancel;
58
59         bool bShowMenu;         // Current state for button's visibility
60
61         char *drm_filepath;
62
63         Ecore_Timer *timer;
64
65         struct {
66                 Evas_Object *box;
67                 double ratio;
68
69                 Eina_Bool bAspectPreserve;
70         } crop;
71
72
73 } TSetAsData;
74
75 #define SETAS_DATA(obj) \
76                 (TSetAsData *)evas_object_data_get((Evas_Object *)(obj), "pSetAsData")
77
78
79
80 static void
81 _ConvertARGB888toY(unsigned char* pBuf, unsigned char* pGrayBuf, int width, int height)
82 {
83 /*
84         User should malloc output buffer
85 */
86         unsigned char* pSrc = (unsigned char*) pBuf;
87         unsigned char* pDSt = (unsigned char*) pGrayBuf;
88
89         unsigned char* pEnd = pDSt + height * width;
90
91         while (pDSt < pEnd)
92         {
93                 pSrc++;         // throw Alpaha value
94
95                 unsigned long r = *pSrc++;
96                 unsigned long g = *pSrc++;
97                 unsigned long b = *pSrc++;
98
99                 *pDSt++ = (308 * r + 600 * g + 116 * b) >> 10;
100         }
101 }
102
103 static void _put_scissorbox(Evas_Object *obj)
104 {
105         TSetAsData *pSetAsData = SETAS_DATA(obj);
106
107         Evas_Object *image = ivug_image_internal_image_get(pSetAsData->photocam);
108
109         Evas_Coord_Rectangle rect;
110
111         {
112                 int image_w = 0;
113                 int image_h = 0;
114                 double ratio = pSetAsData->crop.ratio;
115
116                 ivug_image_image_size_get(pSetAsData->photocam, &image_w, &image_h);    // Get original image size.
117
118                 int px, py, pw, ph;
119                 ivug_image_region_get(pSetAsData->photocam,  &px, &py, &pw, &ph);
120
121                 int ix, iy, iw, ih;
122
123                 if ( image_w > image_h )        // Landscape image
124                 {
125                         if(ratio > 1.0) // height is larger
126                         {
127                                 iw = image_h / (2 * ratio);
128                                 ih = image_h / 2;
129                         }
130                         else
131                         {
132                                 iw = image_h / 2;
133                                 ih = (image_h * ratio) / 2;
134                         }
135                 }
136                 else
137                 {
138                         if(ratio > 1.0) // height is larger
139                         {
140                                 iw = image_w / (2 * ratio);
141                                 ih = image_w / 2;
142                         }
143                         else
144                         {
145                                 iw = image_w / 2;
146                                 ih = (image_w * ratio) / 2;
147                         }
148                 }
149
150                 ix = (image_w - iw)/2;
151                 iy = (image_h - ih)/2;
152
153
154                 rect.x = (double)ix * pw / image_w + px;
155                 rect.y = (double)iy * ph / image_h + py;
156
157                 rect.w = (double)iw * pw / image_w;
158                 rect.h = (double)ih * ph / image_h;
159
160                 MSG_SETAS_WARN("Zoom Put Box in LCD XYWH(%d,%d,%d,%d)",
161                         rect.x, rect.y, rect.w, rect.h);
162
163                 ivug_scissorbox_region_set(pSetAsData->crop.box, rect.x, rect.y, rect.w, rect.h);
164
165         }
166
167         ivug_scissorbox_attach(pSetAsData->crop.box, image);            // Attach to photocam
168
169 }
170
171 static void
172 _on_btn_ok_clicked(void *data, Evas_Object *obj, void *event_info)
173 {
174         TSetAsData *pSetAsData = SETAS_DATA(data);
175         IV_ASSERT(pSetAsData != NULL);
176
177         MSG_SETAS_HIGH("OK button clicked");
178 #if 0
179
180         edje_object_signal_callback_del(_EDJ(pSetAsData->btn_layout),
181                                         "setasview,set,clicked",
182                                         "",
183                                         _on_btn_ok_clicked);
184 #endif
185         evas_object_smart_callback_call(pSetAsData->layout, "ok,clicked", NULL);
186
187         if ( pSetAsData->crop.box )
188         {
189                 evas_object_del(pSetAsData->crop.box);
190                 pSetAsData->crop.box = NULL;
191         }
192
193 }
194
195
196 static void
197 _on_btn_cancel_clicked(void *data, Evas_Object *obj, void *event_info)
198 {
199         TSetAsData *pSetAsData = SETAS_DATA(data);
200         IV_ASSERT(pSetAsData != NULL);
201
202         MSG_SETAS_HIGH("Cancel button clicked");
203         evas_object_smart_callback_call(pSetAsData->layout, "cancel,clicked", NULL);
204
205         if ( pSetAsData->crop.box )
206         {
207                 evas_object_del(pSetAsData->crop.box);
208                 pSetAsData->crop.box = NULL;
209         }
210
211 //      _ivug_setas_view_remove(pSetAsData);
212 }
213
214 static Eina_Bool _on_detect_expired(void *data)
215 {
216         ivug_retv_if(!data, ECORE_CALLBACK_CANCEL);
217
218         TSetAsData *pSetAsData = SETAS_DATA(data);
219
220         pSetAsData->timer = NULL;
221
222         _put_scissorbox(pSetAsData->layout);
223
224         elm_object_item_disabled_set(pSetAsData->btn_ok, EINA_FALSE);
225
226         evas_object_smart_callback_call(pSetAsData->layout, "loaded", NULL);
227
228         pSetAsData->notify = ivug_notify_create(pSetAsData->layout, IDS_CALLER_ID_NOTIFY);
229
230         return ECORE_CALLBACK_CANCEL;
231 }
232
233
234 static void
235 _on_photocam_loaded(void *data, Evas_Object *obj, void *event_info)
236 {
237         TSetAsData *pSetAsData = SETAS_DATA(data);
238         MSG_SETAS_HIGH("Photocam preloaded");
239 #if 0
240         typedef enum _Evas_Load_Error
241         {
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 */
250 #endif
251
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));
254
255         if ( error != EVAS_LOAD_ERROR_NONE )
256         {
257                 MSG_SETAS_ERROR("Error occured during decoding. Error=%d", error);
258
259                 if ( error == EVAS_LOAD_ERROR_UNKNOWN_FORMAT )
260                 {
261                         evas_object_smart_callback_call(pSetAsData->layout, "load,failed", (void *)SETAS_ERROR_TYPE_UNKNOWN_FORMAT);
262                 }
263                 else if ( error == EVAS_LOAD_ERROR_PERMISSION_DENIED )
264                 {
265                         evas_object_smart_callback_call(pSetAsData->layout, "load,failed", (void *)SETAS_ERROR_TYPE_PERMISSION_DENIED);
266                 }
267                 else
268                 {
269                         evas_object_smart_callback_call(pSetAsData->layout, "load,failed", (void *)SETAS_ERROR_TYPE_INVALID_FILE);
270                 }
271
272                 return;
273         }
274
275 // Remove thumbnail
276         Evas_Object *object = elm_object_part_content_unset(pSetAsData->layout, "setasview.thumbnail");
277         if(object != NULL)
278         {
279                 evas_object_del(object);
280         }
281
282         MSG_SETAS_HIGH("Photocam loaded.");
283
284         pSetAsData->timer = ecore_timer_add(0.5, _on_detect_expired, data);
285 }
286
287
288 static void _on_moved(void *data, Evas *e, Evas_Object *obj, void *event_info)
289 {
290 //      TSetAsData *pSetAsData = SETAS_DATA(data);
291
292 }
293
294 static void _on_resized(void *data, Evas *e, Evas_Object *obj, void *event_info)
295 {
296         TSetAsData *pSetAsData = SETAS_DATA(data);
297         ///////////////////////////////////////////////////////////////////
298         int org_x, org_y, org_w, org_h;
299
300         ivug_image_region_get(pSetAsData->photocam, &org_x, &org_y, &org_w, &org_h);
301
302         if(org_w == 0 || org_h == 0)
303                 return;
304
305         MSG_SETAS_MED("org_x=%d, org_y=%d, org_w=%d, org_h=%d", org_x, org_y, org_w, org_h);
306
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);
309
310         MSG_SETAS_MED("org_sx=%d, org_sy=%d, org_sw=%d, org_sh=%d", org_sx, org_sy, org_sw, org_sh);
311
312         int dx = org_sx-org_x;
313         int dy = org_sy-org_y;
314
315         int lcd_x, lcd_y, lcd_w, lcd_h;
316
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);
319
320         int ph, pw;
321
322         int img_w, img_h;
323         int ext_w, ext_h;
324
325         img_w = org_w;
326         img_h = org_h;
327         ext_w = lcd_w;
328         ext_h = lcd_h;
329
330         ph = (img_h * ext_w) / img_w;
331
332         if (ph > ext_h)
333         {
334                 pw = (img_w * ext_h) / img_h;
335                 ph = ext_h;
336         }
337         else
338         {
339                 pw = ext_w;
340         }
341
342         double zoom = 0.0;
343
344         if ( img_w > img_h)
345         {
346                 zoom = (double)pw / img_w;
347         }
348         else
349         {
350                 zoom = (double)ph / img_h;
351         }
352
353         int sx, sy, sw, sh;
354
355         sw = org_sw*zoom;
356         sh = org_sh*zoom;
357         dx *= zoom;
358         dy *= zoom;
359
360         sx = (ext_w-img_w*zoom)/2 + dx;
361         sy = (ext_h-img_h*zoom)/2 + dy;
362
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);
364
365         ///////////////////////////////////////////////////////////////////
366
367         MSG_SETAS_MED("sx=%d, sy=%d, sw=%d, sh=%d", sx, sy, sw, sh);
368
369         ivug_scissorbox_region_set(pSetAsData->crop.box, sx, sy, sw, sh);
370 }
371
372 static void _on_removed(void *data, Evas *e, Evas_Object *obj, void *event_info)
373 {
374         TSetAsData *pSetAsData = SETAS_DATA(data);
375
376         MSG_SETAS_HIGH("Remoing SetAsData");
377
378         if(pSetAsData->timer)
379         {
380                 ecore_timer_del(pSetAsData->timer);
381                 pSetAsData->timer = NULL;
382         }
383
384         if(pSetAsData->notify)
385         {
386                 evas_object_del(pSetAsData->notify);
387                 pSetAsData->notify = NULL;
388         }
389
390         if(pSetAsData->crop.box)
391         {
392                 evas_object_del(pSetAsData->crop.box);
393                 pSetAsData->crop.box = NULL;
394         }
395
396         if(pSetAsData->photocam)
397         {
398                 evas_object_del(pSetAsData->photocam);
399                 pSetAsData->photocam = NULL;
400         }
401
402         if(pSetAsData->drm_filepath)
403         {
404                 ivug_remove_file(pSetAsData->drm_filepath);
405                 free(pSetAsData->drm_filepath);
406                 pSetAsData->drm_filepath = NULL;
407         }
408
409         free(pSetAsData);
410
411 }
412
413 static Evas_Event_Flags _finger_tap_end(void *data , void *event_info)
414 {
415         Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
416
417         MSG_SETAS_HIGH("Finger tab end. evt=%d", p->timestamp);
418
419         if ( p->n != 1 ) return EVAS_EVENT_FLAG_NONE;
420
421         TSetAsData *pSetAsData = (TSetAsData *)data;
422         IV_ASSERT(pSetAsData != NULL);
423
424         if(pSetAsData->bShowMenu)
425         {
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");
430         }
431         else
432         {
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");
437         }
438
439         pSetAsData->bShowMenu = !pSetAsData->bShowMenu;
440
441         return EVAS_EVENT_FLAG_NONE;
442 }
443
444 void _add_gesture_layer(Evas_Object *parent, TSetAsData *pSetAsData)
445 {
446         IV_ASSERT(pSetAsData != NULL);
447
448         Evas_Object *gesture = pSetAsData->gesture;
449
450         gesture = elm_gesture_layer_add(parent);
451         elm_gesture_layer_hold_events_set(gesture, EINA_TRUE);
452
453         elm_gesture_layer_cb_set(gesture, ELM_GESTURE_N_TAPS, ELM_GESTURE_STATE_END, _finger_tap_end, (void *)pSetAsData);
454
455         if ( elm_gesture_layer_attach(gesture, pSetAsData->photocam) == EINA_FALSE)
456         {
457                 MSG_SETAS_ERROR("Cannot attach event rect");
458         }
459
460         evas_object_name_set(gesture, "CallerID:Getsture");
461 }
462
463 Evas_Object *_ivug_setas_callerid_create_layout(Evas_Object *parent)
464 {
465         TSetAsData *pSetAsData = (TSetAsData *)calloc(1, sizeof(TSetAsData));
466
467         if ( pSetAsData == NULL )
468         {
469                 MSG_SETAS_ERROR("Cannot alloc pSetasData");
470                 return NULL;
471         }
472
473         Elm_Object_Item *item[4];
474         Evas_Object *controlbar = NULL;
475
476         pSetAsData->layout = ivug_layout_add(parent , SETAS_EDJ_FILE, "setas_view");
477         if ( pSetAsData->layout == NULL )
478         {
479                 MSG_SETAS_ERROR("Cannot create layout.");
480                 goto error;
481         }
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);
484
485         pSetAsData->crop.box = ivug_scissorbox_add(pSetAsData->layout);
486
487         if ( pSetAsData->crop.box == NULL )
488         {
489                 MSG_SETAS_ERROR("Cannot create layout.");
490                 goto error;
491         }
492
493         evas_object_smart_member_add(pSetAsData->crop.box, pSetAsData->layout);
494 // Create child
495         pSetAsData->btn_layout = ivug_layout_add(pSetAsData->layout , SETAS_EDJ_FILE, "setas_view_btn");
496         if ( pSetAsData->btn_layout == NULL )
497         {
498                 MSG_SETAS_ERROR("Cannot create btn_layout.");
499                 goto error;
500         }
501         evas_object_smart_member_add(pSetAsData->btn_layout, pSetAsData->layout);
502
503
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
508
509         evas_object_name_set(photocam, "setas_photocam");
510
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);
514
515         pSetAsData->photocam = photocam;
516
517         pSetAsData->bShowMenu = true;
518         _add_gesture_layer(pSetAsData->layout, pSetAsData);
519
520         controlbar = ivug_controlbar_add(pSetAsData->layout, "default");
521
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);
526
527         elm_object_item_disabled_set(item[1], EINA_TRUE);
528         elm_object_item_disabled_set(item[2], EINA_TRUE);
529
530         elm_object_part_content_set(pSetAsData->btn_layout, "controlbar", controlbar);
531
532         //Evas_Object *back_btn = ivug_button_add(controlbar, "naviframe/end_btn/default", IDS_BACK, NULL, _on_btn_cancel_clicked, pSetAsData->layout);
533
534         //elm_object_part_content_set(pSetAsData->btn_layout, "elm.swallow.prev_btn", back_btn);
535
536         evas_object_smart_member_add(pSetAsData->btn_layout, pSetAsData->layout);
537
538         pSetAsData->btn_ok = item[0];
539         pSetAsData->btn_cancel = item[3];
540         elm_object_item_disabled_set(pSetAsData->btn_ok, EINA_TRUE);
541
542         MSG_SETAS_HIGH("Create setas layout");
543
544         evas_object_data_set( pSetAsData->layout, "pSetAsData", pSetAsData);
545         evas_object_event_callback_add(pSetAsData->layout, EVAS_CALLBACK_DEL, _on_removed, pSetAsData->layout);
546
547         return pSetAsData->layout;
548
549 error:
550         if ( pSetAsData->crop.box )
551                 evas_object_del(pSetAsData->crop.box);
552
553         if ( pSetAsData->btn_layout )
554                 evas_object_del(pSetAsData->btn_layout);
555
556         if ( pSetAsData->layout )
557                 evas_object_del(pSetAsData->layout);
558
559         if ( pSetAsData )
560                 free(pSetAsData);
561
562         return NULL;
563 }
564
565
566 bool _ivug_setas_callerid_load_file(Evas_Object *obj, const char *filepath)
567 {
568         TSetAsData *pSetAsData = SETAS_DATA(obj);
569
570         MSG_SETAS_HIGH("Load image file : %s", filepath);
571
572         Evas_Load_Error error = EVAS_LOAD_ERROR_NONE;
573
574         if(ivug_drm_is_drm_file(filepath))
575         {
576                 MSG_SETAS_HIGH("DRM File : %s", filepath);
577                 error = EVAS_LOAD_ERROR_PERMISSION_DENIED;
578         }
579         else
580         {
581                 error = ivug_image_file_set(pSetAsData->photocam, filepath, "noAnim");
582         }
583
584         if ( error != EVAS_LOAD_ERROR_NONE )
585         {
586                 // TODO : What is good for error handing??????
587                 MSG_SETAS_ERROR("FileSet Error=%d", error);
588
589                 if ( error == EVAS_LOAD_ERROR_UNKNOWN_FORMAT )
590                 {
591                         evas_object_smart_callback_call(pSetAsData->layout, "load,failed", (void *)SETAS_ERROR_TYPE_UNKNOWN_FORMAT);
592                         return false;
593                 }
594                 else if ( error == EVAS_LOAD_ERROR_PERMISSION_DENIED )
595                 {
596                         evas_object_smart_callback_call(pSetAsData->layout, "load,failed", (void *)SETAS_ERROR_TYPE_PERMISSION_DENIED);
597                         return false;
598                 }
599                 else
600                 {
601                         evas_object_smart_callback_call(pSetAsData->layout, "load,failed", (void *)SETAS_ERROR_TYPE_INVALID_FILE);
602                         return false;
603                 }
604
605                 return false;
606         }
607
608         return true;
609 }
610
611 Evas_Object *_ivug_setas_callerid_internal_image_get(Evas_Object *obj)
612 {
613         TSetAsData *pSetAsData = SETAS_DATA(obj);
614
615         MSG_SETAS_HIGH("Internal image get!");
616
617         return pSetAsData->photocam;
618 }
619
620 bool _ivug_setas_callerid_select_region_get(Evas_Object *obj, int *x, int *y, int *w, int *h)
621 {
622         TSetAsData *pSetAsData = SETAS_DATA(obj);
623
624         if ( pSetAsData->crop.box == NULL)
625         {
626                 return false;
627         }
628
629         ivug_scissorbox_region_get(pSetAsData->crop.box, x, y, w, h);
630
631         return true;
632 }
633
634
635 void _ivug_setas_callerid_aspect_ratio_set(Evas_Object *obj, double ratio)
636 {
637         TSetAsData *pSetAsData = SETAS_DATA(obj);
638
639         pSetAsData->crop.bAspectPreserve = TRUE;
640         pSetAsData->crop.ratio = ratio;
641
642         ivug_scissorbox_ratio_fix( pSetAsData->crop.box, EINA_TRUE);
643 }
644
645
646