zmike pushed a commit to branch efl-1.22. http://git.enlightenment.org/core/efl.git/commit/?id=570005213af84642cab8e0e350aa0b3a49248340
commit 570005213af84642cab8e0e350aa0b3a49248340 Author: Mike Blumenkrantz <[email protected]> Date: Thu Apr 18 09:05:31 2019 -0400 evas: implement Efl.File.unload for evas image classes this fixes unloading images using the evas_object_image_file_set legacy api ref D8616 Differential Revision: https://phab.enlightenment.org/D8618 --- src/lib/evas/canvas/efl_canvas_image.c | 22 ++++++++++++++++++++++ src/lib/evas/canvas/efl_canvas_image.eo | 1 + src/lib/evas/canvas/evas_image_eo.c | 1 + src/lib/evas/canvas/evas_image_legacy.c | 8 ++++++++ src/lib/evas/canvas/evas_image_private.h | 1 + src/lib/evas/canvas/evas_object_image.c | 2 ++ 6 files changed, 35 insertions(+) diff --git a/src/lib/evas/canvas/efl_canvas_image.c b/src/lib/evas/canvas/efl_canvas_image.c index 434c427bb0..9d4c6c4594 100644 --- a/src/lib/evas/canvas/efl_canvas_image.c +++ b/src/lib/evas/canvas/efl_canvas_image.c @@ -4,6 +4,21 @@ #define MY_CLASS EFL_CANVAS_IMAGE_CLASS #define MY_CLASS_NAME efl_class_name_get(MY_CLASS) +void +_evas_image_file_unload(Eo *eo_obj) +{ + Evas_Object_Protected_Data *obj; + Evas_Image_Data *o = efl_data_scope_get(eo_obj, EFL_CANVAS_IMAGE_INTERNAL_CLASS); + + if (!o->cur->f) return; + + obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); + evas_object_async_block(obj); + _evas_image_init_set(NULL, NULL, eo_obj, obj, o, NULL); + o->buffer_data_set = EINA_FALSE; + _evas_image_done_set(eo_obj, obj, o); + o->load_error = EFL_GFX_IMAGE_LOAD_ERROR_NONE; +} Eina_Bool _evas_image_file_load(Eo *eo_obj) { @@ -48,6 +63,13 @@ _efl_canvas_image_efl_file_load(Eo *eo_obj, void *_pd EINA_UNUSED) return EFL_GFX_IMAGE_LOAD_ERROR_DOES_NOT_EXIST; } +EOLIAN static void +_efl_canvas_image_efl_file_unload(Eo *eo_obj, void *_pd EINA_UNUSED) +{ + efl_file_unload(efl_super(eo_obj, MY_CLASS)); + _evas_image_file_unload(eo_obj); +} + const Eina_File * _evas_image_mmap_get(const Eo *eo_obj) { diff --git a/src/lib/evas/canvas/efl_canvas_image.eo b/src/lib/evas/canvas/efl_canvas_image.eo index 2dbad42f60..428a1f900a 100644 --- a/src/lib/evas/canvas/efl_canvas_image.eo +++ b/src/lib/evas/canvas/efl_canvas_image.eo @@ -17,6 +17,7 @@ class @beta Efl.Canvas.Image extends Efl.Canvas.Image_Internal implements Efl.Gfx.Buffer.buffer_map; Efl.Gfx.Buffer.buffer_unmap; Efl.File.load; + Efl.File.unload; Efl.Gfx.Frame_Controller.animated { get; } Efl.Gfx.Frame_Controller.frame { get; set; } Efl.Gfx.Frame_Controller.frame_count { get; } diff --git a/src/lib/evas/canvas/evas_image_eo.c b/src/lib/evas/canvas/evas_image_eo.c index 6c67d08c27..2d4f39ff39 100644 --- a/src/lib/evas/canvas/evas_image_eo.c +++ b/src/lib/evas/canvas/evas_image_eo.c @@ -15,6 +15,7 @@ _evas_image_class_initializer(Efl_Class *klass) EFL_OPS_DEFINE(ops, EFL_OBJECT_OP_FUNC(efl_file_load, _evas_image_efl_file_load), + EFL_OBJECT_OP_FUNC(efl_file_unload, _evas_image_efl_file_unload), EVAS_IMAGE_EXTRA_OPS ); opsp = &ops; diff --git a/src/lib/evas/canvas/evas_image_legacy.c b/src/lib/evas/canvas/evas_image_legacy.c index fc8172719c..6d466be575 100644 --- a/src/lib/evas/canvas/evas_image_legacy.c +++ b/src/lib/evas/canvas/evas_image_legacy.c @@ -1304,4 +1304,12 @@ _evas_image_efl_file_load(Eo *obj, void *pd EINA_UNUSED) return EFL_GFX_IMAGE_LOAD_ERROR_DOES_NOT_EXIST; } +EOLIAN static void +_evas_image_efl_file_unload(Eo *obj, void *pd EINA_UNUSED) +{ + EVAS_IMAGE_API(obj); + efl_file_unload(efl_super(obj, EVAS_IMAGE_CLASS)); + _evas_image_file_unload(obj); +} + #include "canvas/evas_image_eo.c" diff --git a/src/lib/evas/canvas/evas_image_private.h b/src/lib/evas/canvas/evas_image_private.h index 79114b4f99..5a4f3771a2 100644 --- a/src/lib/evas/canvas/evas_image_private.h +++ b/src/lib/evas/canvas/evas_image_private.h @@ -162,6 +162,7 @@ void _evas_image_fill_set(Eo *eo_obj, Evas_Image_Data *o, int x, int y, int w, i /* Efl.File */ Eina_Bool _evas_image_file_load(Eo *eo_obj); +void _evas_image_file_unload(Eo *eo_obj); const Eina_File *_evas_image_mmap_get(const Eo *eo_obj); const char *_evas_image_key_get(const Eo *eo_obj); void _efl_canvas_image_load_error_set(Eo *eo_obj EINA_UNUSED, Eina_Error err); diff --git a/src/lib/evas/canvas/evas_object_image.c b/src/lib/evas/canvas/evas_object_image.c index 5beeb4b0ce..1d9ede0de7 100644 --- a/src/lib/evas/canvas/evas_object_image.c +++ b/src/lib/evas/canvas/evas_object_image.c @@ -283,7 +283,9 @@ _evas_image_init_set(const Eina_File *f, const char *key, } ENFN->image_free(ENC, o->engine_data); } + o->engine_data = NULL; o->load_error = EFL_GFX_IMAGE_LOAD_ERROR_NONE; + if (!lo) return; lo->emile.scale_down_by = o->load_opts->scale_down_by; lo->emile.dpi = o->load_opts->dpi; lo->emile.w = o->load_opts->w; --
