diff --git a/src/lib/evas/cache/evas_cache.h b/src/lib/evas/cache/evas_cache.h index 14798ce4d2..1edd9e0f2b 100644 --- a/src/lib/evas/cache/evas_cache.h +++ b/src/lib/evas/cache/evas_cache.h @@ -161,7 +161,7 @@ EAPI Engine_Image_Entry* evas_cache_engine_image_size_set(Engine_Image_Entr EAPI void evas_cache_engine_image_load_data(Engine_Image_Entry *eim); -EAPI void evas_cache_image_preload_data(Image_Entry *im, const Eo *target); +EAPI void evas_cache_image_preload_data(Image_Entry *im, const Eo *target, void (*preloaded_cb)(void *data), void *preloaded_data); EAPI void evas_cache_image_preload_cancel(Image_Entry *im, const Eo *target); EAPI int evas_cache_async_frozen_get(void); diff --git a/src/lib/evas/cache/evas_cache_image.c b/src/lib/evas/cache/evas_cache_image.c index c41f167e54..9be38b928d 100644 --- a/src/lib/evas/cache/evas_cache_image.c +++ b/src/lib/evas/cache/evas_cache_image.c @@ -391,17 +391,9 @@ _evas_cache_image_preloaded_notify(Image_Entry *ie) ie->targets = (Evas_Cache_Target *) eina_inlist_remove(EINA_INLIST_GET(ie->targets), EINA_INLIST_GET(ie->targets)); - if (tmp->preloaded_cb) - { - if (!tmp->delete_me) - { - tmp->preloaded_cb(tmp->preloaded_data); - } - } - else - { - evas_object_inform_call_image_preloaded((Evas_Object*) tmp->target); - } + if (!tmp->delete_me && tmp->preloaded_cb) + tmp->preloaded_cb(tmp->preloaded_data); + evas_object_inform_call_image_preloaded((Evas_Object*) tmp->target); free(tmp); } } @@ -471,7 +463,7 @@ _evas_cache_image_async_cancel(void *data) // note - preload_add assumes a target is ONLY added ONCE to the image // entry. make sure you only add once, or remove first, then add static int -_evas_cache_image_entry_preload_add(Image_Entry *ie, const Eo *target) +_evas_cache_image_entry_preload_add(Image_Entry *ie, const Eo *target, void (*preloaded_cb)(void *), void *preloaded_data) { Evas_Cache_Target *tg; @@ -486,6 +478,8 @@ _evas_cache_image_entry_preload_add(Image_Entry *ie, const Eo *target) tg = calloc(1, sizeof(Evas_Cache_Target)); if (!tg) return 0; tg->target = target; + tg->preloaded_cb = preloaded_cb; + tg->preloaded_data = preloaded_data; ie->targets = (Evas_Cache_Target *) eina_inlist_append(EINA_INLIST_GET(ie->targets), EINA_INLIST_GET(tg)); @@ -1254,7 +1248,7 @@ evas_cache_image_is_loaded(Image_Entry *im) } EAPI void -evas_cache_image_preload_data(Image_Entry *im, const Eo *target) +evas_cache_image_preload_data(Image_Entry *im, const Eo *target, void (*preloaded_cb)(void *), void *preloaded_data) { RGBA_Image *img = (RGBA_Image *)im; @@ -1270,7 +1264,7 @@ evas_cache_image_preload_data(Image_Entry *im, const Eo *target) return; } im->flags.loaded = 0; - if (!_evas_cache_image_entry_preload_add(im, target)) + if (!_evas_cache_image_entry_preload_add(im, target, preloaded_cb, preloaded_data)) evas_object_inform_call_image_preloaded((Evas_Object*) target); evas_cache_image_drop(im); } diff --git a/src/lib/evas/cache2/evas_cache2.c b/src/lib/evas/cache2/evas_cache2.c index 893abe3205..795d21d27a 100644 --- a/src/lib/evas/cache2/evas_cache2.c +++ b/src/lib/evas/cache2/evas_cache2.c @@ -314,18 +314,9 @@ _evas_cache2_image_preloaded_cb(void *data, Eina_Bool success) EINA_INLIST_GET(ie->targets)); if (!ie->flags.delete_me) { - if (tmp->preloaded_cb) - { - if (!tmp->delete_me) - { - tmp->preloaded_cb(tmp->preloaded_data); - } - } - else - { - evas_object_inform_call_image_preloaded - ((Evas_Object *)tmp->target); - } + if (!tmp->delete_me && tmp->preloaded_cb) + tmp->preloaded_cb(tmp->preloaded_data); + evas_object_inform_call_image_preloaded((Evas_Object *)tmp->target); } free(tmp); } @@ -335,7 +326,7 @@ _evas_cache2_image_preloaded_cb(void *data, Eina_Bool success) } static Eina_Bool -_evas_cache2_image_entry_preload_add(Image_Entry *ie, const void *target) +_evas_cache2_image_entry_preload_add(Image_Entry *ie, const void *target, void (*preloaded_cb)(void *), void *preloaded_data) { Evas_Cache_Target *tg; @@ -347,6 +338,9 @@ _evas_cache2_image_entry_preload_add(Image_Entry *ie, const void *target) return EINA_TRUE; tg->target = target; + tg->preloaded_cb = preloaded_cb; + tg->preloaded_data = preloaded_data; + ie->targets = (Evas_Cache_Target *) eina_inlist_append(EINA_INLIST_GET(ie->targets), EINA_INLIST_GET(tg)); @@ -1063,7 +1057,7 @@ evas_cache2_image_unload_data(Image_Entry *im) } EAPI void -evas_cache2_image_preload_data(Image_Entry *im, const void *target) +evas_cache2_image_preload_data(Image_Entry *im, const void *target, void (*preloaded_cb)(void *), void *preloaded_data) { RGBA_Image *img = (RGBA_Image *)im; @@ -1073,7 +1067,7 @@ evas_cache2_image_preload_data(Image_Entry *im, const void *target) return; } - if (!_evas_cache2_image_entry_preload_add(im, target)) + if (!_evas_cache2_image_entry_preload_add(im, target, preloaded_cb, preloaded_data)) evas_object_inform_call_image_preloaded((Evas_Object *)target); } diff --git a/src/lib/evas/cache2/evas_cache2.h b/src/lib/evas/cache2/evas_cache2.h index efa76fc5b3..8ef9df8b55 100644 --- a/src/lib/evas/cache2/evas_cache2.h +++ b/src/lib/evas/cache2/evas_cache2.h @@ -65,7 +65,7 @@ EAPI void evas_cache2_image_ref(Image_Entry *im); EAPI void evas_cache2_image_close(Image_Entry *im); EAPI int evas_cache2_image_load_data(Image_Entry *ie); EAPI void evas_cache2_image_unload_data(Image_Entry *im); -EAPI void evas_cache2_image_preload_data(Image_Entry *im, const void *target); +EAPI void evas_cache2_image_preload_data(Image_Entry *im, const void *target, void (*preloaded_cb)(void *data), void *data); EAPI void evas_cache2_image_preload_cancel(Image_Entry *im, const void *target); EAPI void evas_cache2_image_cache_key_create(char *hkey, const char *path, size_t pathlen, const char *key, size_t keylen, const Evas_Image_Load_Opts *lo); diff --git a/src/modules/evas/engines/gl_common/evas_gl_common.h b/src/modules/evas/engines/gl_common/evas_gl_common.h index 7ae78a799d..06cdbbf6cf 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_common.h +++ b/src/modules/evas/engines/gl_common/evas_gl_common.h @@ -735,7 +735,7 @@ Evas_GL_Image *evas_gl_common_image_mmap(Evas_Engine_GL_Context *gc, Eina_Fil Evas_GL_Image *evas_gl_common_image_new_from_copied_data(Evas_Engine_GL_Context *gc, unsigned int w, unsigned int h, DATA32 *data, int alpha, Evas_Colorspace cspace); Evas_GL_Image *evas_gl_common_image_new(Evas_Engine_GL_Context *gc, unsigned int w, unsigned int h, int alpha, Evas_Colorspace cspace); Evas_GL_Image *evas_gl_common_image_new_from_rgbaimage(Evas_Engine_GL_Context *gc, RGBA_Image *im, Evas_Image_Load_Opts *lo, int *error); -void evas_gl_common_image_preload_watch(Evas_GL_Image *im); +void evas_gl_common_image_preload_done(void *data /*Evas_GL_Image *im*/); void evas_gl_common_image_preload_unwatch(Evas_GL_Image *im); Evas_GL_Image *evas_gl_common_image_alpha_set(Evas_GL_Image *im, int alpha); void evas_gl_common_image_scale_hint_set(Evas_GL_Image *im, int hint); diff --git a/src/modules/evas/engines/gl_common/evas_gl_image.c b/src/modules/evas/engines/gl_common/evas_gl_image.c index 2716f58387..22cce55ab8 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_image.c +++ b/src/modules/evas/engines/gl_common/evas_gl_image.c @@ -150,8 +150,8 @@ _evas_gl_cspace_list_fill(Evas_Engine_GL_Context *gc) CS_APPEND(EVAS_COLORSPACE_ARGB8888); } -static void -preload_done(void *data) +void +evas_gl_common_image_preload_done(void *data) { Evas_GL_Image *im = data; @@ -192,26 +192,9 @@ found_cspace: im->w = im->im->cache_entry.w; im->h = im->im->cache_entry.h; } - evas_gl_common_image_preload_unwatch(im); -} - -void -evas_gl_common_image_preload_watch(Evas_GL_Image *im) -{ - Evas_Cache_Target *tg; - - if (!im->im) return; - tg = calloc(1, sizeof(Evas_Cache_Target)); - if (tg) - { - tg->preloaded_cb = preload_done; - tg->preloaded_data = im; - im->im->cache_entry.targets = (Evas_Cache_Target *) - eina_inlist_append(EINA_INLIST_GET(im->im->cache_entry.targets), - EINA_INLIST_GET(tg)); - } } +//FIXME: This is a hacky way. Need an proper interface... void evas_gl_common_image_preload_unwatch(Evas_GL_Image *im) { @@ -221,7 +204,7 @@ evas_gl_common_image_preload_unwatch(Evas_GL_Image *im) if (!im->im) return; EINA_INLIST_FOREACH_SAFE(im->im->cache_entry.targets, l2, tg) { - if ((tg->preloaded_cb != preload_done) || (tg->preloaded_data != im)) + if ((tg->preloaded_cb != evas_gl_common_image_preload_done) || (tg->preloaded_data != im)) continue; tg->delete_me = EINA_TRUE; break; diff --git a/src/modules/evas/engines/gl_generic/evas_engine.c b/src/modules/evas/engines/gl_generic/evas_engine.c index 1749dc1025..ec29b19cdc 100644 --- a/src/modules/evas/engines/gl_generic/evas_engine.c +++ b/src/modules/evas/engines/gl_generic/evas_engine.c @@ -1132,13 +1132,12 @@ eng_image_data_preload_request(void *engine EINA_UNUSED, void *image, const Eo * im = (RGBA_Image *)gim->im; if (!im) return; - evas_gl_common_image_preload_watch(gim); #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get() && evas_cache2_image_cached(&im->cache_entry)) - evas_cache2_image_preload_data(&im->cache_entry, target); + evas_cache2_image_preload_data(&im->cache_entry, target, evas_gl_common_image_preload_done, gim); else #endif - evas_cache_image_preload_data(&im->cache_entry, target); + evas_cache_image_preload_data(&im->cache_entry, target, evas_gl_common_image_preload_done, gim); } static void diff --git a/src/modules/evas/engines/software_generic/evas_engine.c b/src/modules/evas/engines/software_generic/evas_engine.c index 2a833e1a69..7276e64d60 100644 --- a/src/modules/evas/engines/software_generic/evas_engine.c +++ b/src/modules/evas/engines/software_generic/evas_engine.c @@ -2339,11 +2339,11 @@ eng_image_data_preload_request(void *data EINA_UNUSED, void *image, const Eo *ta #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get() && evas_cache2_image_cached(&im->cache_entry)) { - evas_cache2_image_preload_data(&im->cache_entry, target); + evas_cache2_image_preload_data(&im->cache_entry, target, NULL, NULL); return; } #endif - evas_cache_image_preload_data(&im->cache_entry, target); + evas_cache_image_preload_data(&im->cache_entry, target, NULL, NULL); } static void