discomfitor pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=868e3308b12c6279a9ea46d3a5670375251c796e

commit 868e3308b12c6279a9ea46d3a5670375251c796e
Author: Hermet Park <hermetp...@gmail.com>
Date:   Thu Aug 2 09:22:59 2018 -0400

    elementary image: apply lazy calculation and guarantee retained method.
    
    Summary:
    Image couldn't gurantee retained concept status.
    This patch change to setting up image object on the request time,
    recovering image status, removing unencessary jobs.
    
    Reviewers: #committers
    
    Subscribers: cedric, #committers, zmike
    
    Tags: #efl
    
    Differential Revision: https://phab.enlightenment.org/D6726
---
 src/lib/elementary/efl_ui_image.c        | 104 +++++++++++++++----------------
 src/lib/elementary/efl_ui_widget_image.h |   2 +
 2 files changed, 53 insertions(+), 53 deletions(-)

diff --git a/src/lib/elementary/efl_ui_image.c 
b/src/lib/elementary/efl_ui_image.c
index 9d83ce37f8..ca1dbb0ec5 100644
--- a/src/lib/elementary/efl_ui_image.c
+++ b/src/lib/elementary/efl_ui_image.c
@@ -77,6 +77,19 @@ _prev_img_del(Efl_Ui_Image_Data *sd)
 }
 
 static void
+_recover_status(Eo *obj, Efl_Ui_Image_Data *sd)
+{
+   int r, g, b, a;
+   Evas_Object *pclip = efl_canvas_object_clip_get(obj);
+   if (pclip) efl_canvas_object_clip_set(sd->img, pclip);
+
+   efl_gfx_color_get(obj, &r, &g, &b, &a);
+   efl_gfx_color_set(sd->img, r, g, b, a);
+
+   efl_gfx_entity_visible_set(sd->img, sd->show);
+}
+
+static void
 _on_image_preloaded(void *data,
                     Evas *e EINA_UNUSED,
                     Evas_Object *obj,
@@ -143,7 +156,6 @@ _img_new(Evas_Object *obj)
    evas_object_image_scale_hint_set(img, EVAS_IMAGE_SCALE_HINT_STATIC);
    evas_object_event_callback_add
      (img, EVAS_CALLBACK_IMAGE_PRELOADED, _on_image_preloaded, sd);
-
    evas_object_smart_member_add(img, obj);
    elm_widget_sub_object_add(obj, img);
 
@@ -170,7 +182,6 @@ _image_sizing_eval(Efl_Ui_Image_Data *sd, Evas_Object *img)
 
         //1. Get the original image size (iw x ih)
         evas_object_image_size_get(img, &iw, &ih);
-
         iw = ((double)iw) * sd->scale;
         ih = ((double)ih) * sd->scale;
 
@@ -275,14 +286,6 @@ done:
    evas_object_resize(sd->hit_rect, w, h);
 }
 
-static void
-_efl_ui_image_internal_sizing_eval(Evas_Object *obj EINA_UNUSED, 
Efl_Ui_Image_Data *sd)
-{
-   if (!sd->img) return;
-   _image_sizing_eval(sd, sd->img);
-   if (sd->prev_img) _image_sizing_eval(sd, sd->prev_img);
-}
-
 static inline void
 _async_open_data_free(Async_Open_Data *data)
 {
@@ -472,27 +475,23 @@ _efl_ui_image_edje_file_set(Evas_Object *obj,
                          const Eina_File *f,
                          const char *group)
 {
-   Evas_Object *pclip;
-
    EFL_UI_IMAGE_DATA_GET(obj, sd);
 
    _prev_img_del(sd);
 
    if (!sd->edje)
      {
-        pclip = evas_object_clip_get(sd->img);
         evas_object_del(sd->img);
 
         /* Edje object instead */
         sd->img = edje_object_add(evas_object_evas_get(obj));
+        _recover_status(obj, sd);
+        sd->edje = EINA_TRUE;
         evas_object_smart_member_add(sd->img, obj);
-        if (sd->show) evas_object_show(sd->img);
-        evas_object_clip_set(sd->img, pclip);
      }
 
    _async_cancel(sd);
 
-   sd->edje = EINA_TRUE;
    if (!sd->async_enable)
      {
         if (f)
@@ -572,9 +571,6 @@ _efl_ui_image_efl_canvas_group_group_add(Eo *obj, 
Efl_Ui_Image_Data *priv)
    evas_object_event_callback_add
       (priv->hit_rect, EVAS_CALLBACK_MOUSE_UP, _on_mouse_up, obj);
 
-   /* starts as an Evas image. may switch to an Edje object */
-   priv->img = _img_new(obj);
-
    priv->smooth = EINA_TRUE;
    priv->fill_inside = EINA_TRUE;
    priv->aspect_fixed = EINA_TRUE;
@@ -586,8 +582,6 @@ _efl_ui_image_efl_canvas_group_group_add(Eo *obj, 
Efl_Ui_Image_Data *priv)
    priv->align_y = 0.5;
 
    elm_widget_can_focus_set(obj, EINA_FALSE);
-
-   _efl_ui_image_sizing_eval(obj);
 }
 
 EOLIAN static void
@@ -596,6 +590,7 @@ _efl_ui_image_efl_canvas_group_group_del(Eo *obj, 
Efl_Ui_Image_Data *sd)
    if (elm_widget_is_legacy(obj))
      efl_event_callback_del(obj, EFL_GFX_ENTITY_EVENT_CHANGE_SIZE_HINTS,
                             _on_size_hints_changed, sd);
+   ecore_job_del(sd->sizing_job);
    ecore_timer_del(sd->anim_timer);
    evas_object_del(sd->img);
    _prev_img_del(sd);
@@ -657,7 +652,7 @@ _efl_ui_image_show(Eo *obj, Efl_Ui_Image_Data *sd)
    efl_gfx_entity_visible_set(efl_super(obj, MY_CLASS), EINA_TRUE);
 
    if (sd->preload_status == EFL_UI_IMAGE_PRELOADING) return;
-   efl_gfx_entity_visible_set(sd->img, EINA_TRUE);
+   if (sd->img) efl_gfx_entity_visible_set(sd->img, EINA_TRUE);
    _prev_img_del(sd);
 }
 
@@ -666,7 +661,7 @@ _efl_ui_image_hide(Eo *obj, Efl_Ui_Image_Data *sd)
 {
    sd->show = EINA_FALSE;
    efl_gfx_entity_visible_set(efl_super(obj, MY_CLASS), EINA_FALSE);
-   efl_gfx_entity_visible_set(sd->img, EINA_FALSE);
+   if (sd->img) efl_gfx_entity_visible_set(sd->img, EINA_FALSE);
    _prev_img_del(sd);
 }
 
@@ -698,7 +693,7 @@ _efl_ui_image_efl_gfx_color_color_set(Eo *obj, 
Efl_Ui_Image_Data *sd, int r, int
    efl_gfx_color_set(efl_super(obj, MY_CLASS), r, g, b, a);
 
    evas_object_color_set(sd->hit_rect, 0, 0, 0, 0);
-   evas_object_color_set(sd->img, r, g, b, a);
+   if (sd->img) evas_object_color_set(sd->img, r, g, b, a);
    if (sd->prev_img) evas_object_color_set(sd->prev_img, r, g, b, a);
 }
 
@@ -710,7 +705,7 @@ _efl_ui_image_efl_canvas_object_clip_set(Eo *obj, 
Efl_Ui_Image_Data *sd, Evas_Ob
 
    efl_canvas_object_clip_set(efl_super(obj, MY_CLASS), clip);
 
-   evas_object_clip_set(sd->img, clip);
+   if (sd->img) evas_object_clip_set(sd->img, clip);
    if (sd->prev_img) evas_object_clip_set(sd->prev_img, clip);
 }
 
@@ -737,31 +732,23 @@ _key_action_activate(Evas_Object *obj, const char *params 
EINA_UNUSED)
    return EINA_TRUE;
 }
 
-// TODO: remove this function after using the widget's scale value instead of 
image's scale value, 
-
 static void
-_efl_ui_image_internal_scale_set(Evas_Object *obj, Efl_Ui_Image_Data *sd, 
double scale)
-{
-   sd->scale = scale;
-   _efl_ui_image_internal_sizing_eval(obj, sd);
-}
-
-void
-_efl_ui_image_sizing_eval(Evas_Object *obj)
+_sizing_eval_cb(void *data)
 {
+   Evas_Object *obj = data;
    Evas_Coord minw = -1, minh = -1, maxw = -1, maxh = -1;
    Eina_Size2D sz;
    double ts;
 
    EFL_UI_IMAGE_DATA_GET_OR_RETURN(obj, sd);
 
-   _efl_ui_image_internal_sizing_eval(obj, sd);
-   efl_gfx_image_smooth_scale_set(obj, sd->smooth);
+   sd->sizing_job = NULL;
 
+   // TODO: remove this function after using the widget's scale value instead 
of image's scale value,
    if (sd->no_scale)
-     _efl_ui_image_internal_scale_set(obj, sd, 1.0);
+     sd->scale = 1.0;
    else
-     _efl_ui_image_internal_scale_set(obj, sd, efl_gfx_entity_scale_get(obj) * 
elm_config_scale_get());
+     sd->scale = efl_gfx_entity_scale_get(obj) * elm_config_scale_get();
 
    ts = sd->scale;
    sd->scale = 1.0;
@@ -801,6 +788,21 @@ _efl_ui_image_sizing_eval(Evas_Object *obj)
 
    evas_object_size_hint_min_set(obj, minw, minh);
    evas_object_size_hint_max_set(obj, maxw, maxh);
+
+   if (sd->img)
+   {
+      _image_sizing_eval(sd, sd->img);
+      if (sd->prev_img) _image_sizing_eval(sd, sd->prev_img);
+   }
+}
+
+void
+_efl_ui_image_sizing_eval(Evas_Object *obj)
+{
+   EFL_UI_IMAGE_DATA_GET_OR_RETURN(obj, sd);
+
+   if (sd->sizing_job) ecore_job_del(sd->sizing_job);
+   sd->sizing_job = ecore_job_add(_sizing_eval_cb, obj);
 }
 
 static void
@@ -816,25 +818,17 @@ _efl_ui_image_load_size_set_internal(Evas_Object *obj, 
Efl_Ui_Image_Data *sd)
 static void
 _efl_ui_image_file_set_do(Evas_Object *obj)
 {
-   Evas_Object *pclip = NULL;
-
    EFL_UI_IMAGE_DATA_GET(obj, sd);
 
    ELM_SAFE_FREE(sd->prev_img, evas_object_del);
-   if (sd->img)
-     {
-        pclip = evas_object_clip_get(sd->img);
-        sd->prev_img = sd->img;
-     }
 
+   sd->prev_img = sd->img;
    sd->img = _img_new(obj);
-
-   evas_object_image_load_orientation_set(sd->img, EINA_TRUE);
-
-   evas_object_clip_set(sd->img, pclip);
+   _recover_status(obj, sd);
 
    sd->edje = EINA_FALSE;
-
+   evas_object_image_smooth_scale_set(sd->img, sd->smooth);
+   evas_object_image_load_orientation_set(sd->img, EINA_TRUE);
    _efl_ui_image_load_size_set_internal(obj, sd);
 }
 
@@ -1242,7 +1236,11 @@ _efl_ui_image_efl_gfx_view_view_size_get(const Eo *obj 
EINA_UNUSED, Efl_Ui_Image
 {
    int tw, th;
 
-   if (efl_isa(sd->img, EFL_CANVAS_LAYOUT_CLASS))
+   if (!sd->img)
+     {
+        tw = 0; th = 0;
+     }
+   else if (efl_isa(sd->img, EFL_CANVAS_LAYOUT_CLASS))
      edje_object_size_min_get(sd->img, &tw, &th);
    else
      evas_object_image_size_get(sd->img, &tw, &th);
@@ -1253,7 +1251,7 @@ _efl_ui_image_efl_gfx_view_view_size_get(const Eo *obj 
EINA_UNUSED, Efl_Ui_Image
 EOLIAN static Eina_Size2D
 _efl_ui_image_efl_gfx_image_image_size_get(const Eo *obj EINA_UNUSED, 
Efl_Ui_Image_Data *sd)
 {
-   if (sd->edje)
+   if (!sd->img || sd->edje)
      return EINA_SIZE2D(0, 0);
 
    return efl_gfx_image_size_get(sd->img);
diff --git a/src/lib/elementary/efl_ui_widget_image.h 
b/src/lib/elementary/efl_ui_widget_image.h
index 159f6ce232..8fae00f950 100644
--- a/src/lib/elementary/efl_ui_widget_image.h
+++ b/src/lib/elementary/efl_ui_widget_image.h
@@ -92,6 +92,8 @@ struct _Efl_Ui_Image_Data
       Eina_Bool use : 1;
    } freedesktop;
 
+   Ecore_Job *sizing_job;
+
    Eina_Bool             aspect_fixed : 1;
    Eina_Bool             fill_inside : 1;
    Eina_Bool             no_scale : 1;

-- 


Reply via email to