jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=331bf9f74683aad72415e007af14c3d4713f112b

commit 331bf9f74683aad72415e007af14c3d4713f112b
Author: Jean-Philippe Andre <jp.an...@samsung.com>
Date:   Thu Apr 20 18:29:26 2017 +0900

    elm_image: Fix file_set when preload is disabled
    
    If we disable preload, then the second file set on an elm_image
    object would not trigger a deletion of the first image. As a
    consequence, both images would be visible... really bad if there's
    alpha or different dimensions!
    
    Thanks Anand Kumar for the report!
    
    @fix
---
 src/bin/elementary/test_image.c   | 67 ++++++++++++++++++++++++++++++++-------
 src/lib/elementary/efl_ui_image.c | 18 ++++++++---
 2 files changed, 70 insertions(+), 15 deletions(-)

diff --git a/src/bin/elementary/test_image.c b/src/bin/elementary/test_image.c
index fc6bdf1..5da9f6c 100644
--- a/src/bin/elementary/test_image.c
+++ b/src/bin/elementary/test_image.c
@@ -347,7 +347,7 @@ _img_load_cancel_cb(void *data, Evas_Object *obj 
EINA_UNUSED, void *event_info E
 }
 
 static void
-_create_image(Evas_Object *data, Eina_Bool async, Eina_Bool preload)
+_create_image(Evas_Object *data, Eina_Bool async, Eina_Bool preload, Eina_Bool 
logo)
 {
    Evas_Object *win = data;
    Evas_Object *im, *status_text;
@@ -381,12 +381,15 @@ _create_image(Evas_Object *data, Eina_Bool async, 
Eina_Bool preload)
    evas_object_smart_callback_add(im, "load,cancel", _img_load_cancel_cb, 
status_text);
 
    STATUS_SET(status_text, "Loading image...");
-   snprintf(buf, sizeof(buf) - 1, "%s/images/insanely_huge_test_image.jpg", 
elm_app_data_dir_get());
+   if (!logo)
+     snprintf(buf, sizeof(buf) - 1, "%s/images/insanely_huge_test_image.jpg", 
elm_app_data_dir_get());
+   else
+     snprintf(buf, sizeof(buf) - 1, "%s/images/logo.png", 
elm_app_data_dir_get());
    elm_image_file_set(im, buf, NULL);
 }
 
 static void
-_bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info 
EINA_UNUSED)
+_reload_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info 
EINA_UNUSED)
 {
    Evas_Object *win = data;
    Evas_Object *im = evas_object_data_get(win, "im");
@@ -394,9 +397,37 @@ _bt_clicked(void *data, Evas_Object *obj EINA_UNUSED, void 
*event_info EINA_UNUS
    Evas_Object *chk2 = evas_object_data_get(win, "chk2");
    Eina_Bool async = elm_check_state_get(chk1);
    Eina_Bool preload = elm_check_state_get(chk2);
+   Eina_Bool logo = EINA_FALSE;
+   const char *file = NULL;
+
+   elm_image_file_get(im, &file, NULL);
+   logo = (file && strstr(file, "logo"));
 
    evas_object_del(im);
-   _create_image(win, async, preload);
+   _create_image(win, async, preload, logo);
+}
+
+static void
+_switch_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info 
EINA_UNUSED)
+{
+   Evas_Object *win = data;
+   Evas_Object *im = evas_object_data_get(win, "im");
+   char buf[PATH_MAX] = {0};
+   Eina_Bool logo = EINA_FALSE;
+   const char *file = NULL;
+
+   elm_image_file_get(im, &file, NULL);
+   logo = (file && strstr(file, "logo"));
+
+   if (logo)
+     {
+        snprintf(buf, sizeof(buf) - 1, 
"%s/images/insanely_huge_test_image.jpg", elm_app_data_dir_get());
+     }
+   else
+     {
+        snprintf(buf, sizeof(buf) - 1, "%s/images/logo.png", 
elm_app_data_dir_get());
+     }
+   elm_image_file_set(im, buf, NULL);
 }
 
 void
@@ -414,7 +445,7 @@ test_load_image(void *data EINA_UNUSED, Evas_Object *obj  
EINA_UNUSED, void *eve
    evas_object_show(box);
    evas_object_data_set(win, "box", box);
 
-   _create_image(win, EINA_FALSE, EINA_FALSE);
+   _create_image(win, EINA_FALSE, EINA_FALSE, EINA_FALSE);
 
    hbox = elm_box_add(win);
    elm_box_horizontal_set(hbox, EINA_TRUE);
@@ -448,12 +479,26 @@ test_load_image(void *data EINA_UNUSED, Evas_Object *obj  
EINA_UNUSED, void *eve
    evas_object_show(hbox);
    elm_box_pack_end(box, hbox);
 
-   bt = elm_button_add(win);
-   evas_object_size_hint_align_set(bt, 0.5, 0.0);
-   elm_object_text_set(bt, "Image Reload");
-   evas_object_smart_callback_add(bt, "clicked", _bt_clicked, win);
-   elm_box_pack_end(box, bt);
-   evas_object_show(bt);
+   hbox = elm_box_add(win);
+   elm_box_horizontal_set(hbox, EINA_TRUE);
+   elm_box_align_set(hbox, 0.5, 0.5);
+   evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, 0.0);
+   evas_object_size_hint_align_set(hbox, EVAS_HINT_FILL, 0.0);
+   {
+      bt = elm_button_add(win);
+      elm_object_text_set(bt, "Image Reload");
+      evas_object_smart_callback_add(bt, "clicked", _reload_clicked, win);
+      elm_box_pack_end(hbox, bt);
+      evas_object_show(bt);
+
+      bt = elm_button_add(win);
+      elm_object_text_set(bt, "Image Switch");
+      evas_object_smart_callback_add(bt, "clicked", _switch_clicked, win);
+      elm_box_pack_end(hbox, bt);
+      evas_object_show(bt);
+   }
+   evas_object_show(hbox);
+   elm_box_pack_end(box, hbox);
 
    evas_object_resize(win, 320, 480);
    evas_object_show(win);
diff --git a/src/lib/elementary/efl_ui_image.c 
b/src/lib/elementary/efl_ui_image.c
index 0576fbb..9b59638 100644
--- a/src/lib/elementary/efl_ui_image.c
+++ b/src/lib/elementary/efl_ui_image.c
@@ -382,7 +382,10 @@ _efl_ui_image_async_open_done(void *data, Ecore_Thread 
*thread)
                   if (ok)
                     {
                        if (sd->edje)
-                         ok = edje_object_mmap_set(sd->img, f, key);
+                         {
+                            _prev_img_del(sd);
+                            ok = edje_object_mmap_set(sd->img, f, key);
+                         }
                        else
                          ok = _efl_ui_image_smart_internal_file_set
                            (sd->self, sd, file, f, key);
@@ -904,7 +907,9 @@ _efl_ui_image_smart_internal_file_set(Eo *obj, 
Efl_Ui_Image_Data *sd,
         return EINA_FALSE;
      }
 
-   if (sd->preload_status != EFL_UI_IMAGE_PRELOAD_DISABLED)
+   if (sd->preload_status == EFL_UI_IMAGE_PRELOAD_DISABLED)
+     _prev_img_del(sd);
+   else
      {
         evas_object_hide(sd->img);
         sd->preload_status = EFL_UI_IMAGE_PRELOADING;
@@ -1989,8 +1994,13 @@ elm_image_memfile_set(Evas_Object *obj, const void *img, 
size_t size, const char
    evas_object_image_memfile_set
      (sd->img, (void *)img, size, (char *)format, (char *)key);
 
-   sd->preload_status = EFL_UI_IMAGE_PRELOADING;
-   evas_object_image_preload(sd->img, EINA_FALSE);
+   if (sd->preload_status == EFL_UI_IMAGE_PRELOAD_DISABLED)
+     _prev_img_del(sd);
+   else
+     {
+        sd->preload_status = EFL_UI_IMAGE_PRELOADING;
+        evas_object_image_preload(sd->img, EINA_FALSE);
+     }
 
    err = evas_object_image_load_error_get(sd->img);
    if (err != EVAS_LOAD_ERROR_NONE)

-- 


Reply via email to