EAPI void evas_cache_engine_image_load_data(Engine_Image_Entry *eim);
EAPI void evas_cache_image_preload_data(Image_Entry *im, const void *target);
-EAPI void evas_cache_image_preload_cancel(Image_Entry *im);
+EAPI void evas_cache_image_preload_cancel(Image_Entry *im, const void *target);
#ifdef __cplusplus
}
}
#ifdef BUILD_ASYNC_PRELOAD
+static void
+_evas_cache_image_async_call(Image_Entry *im)
+{
+ pthread_mutex_lock(&mutex);
+ while (im->targets)
+ {
+ Evas_Cache_Target *tmp = im->targets;
+
+ evas_async_events_put(tmp->target, EVAS_CALLBACK_IMAGE_PRELOADED, NULL,
+ (void (*)(void*, Evas_Callback_Type, void*))evas_object_event_callback_call);
+ im->targets = (Evas_Cache_Target*) eina_inlist_remove(EINA_INLIST_GET(im->targets), EINA_INLIST_GET(im->targets));
+ free(tmp);
+ }
+ pthread_mutex_unlock(&mutex);
+}
+
static int
_evas_cache_image_entry_preload_add(Image_Entry *ie,
const void *target)
}
static int
-_evas_cache_image_entry_preload_remove(Image_Entry *ie)
+_evas_cache_image_entry_preload_remove(Image_Entry *ie, const void *target)
{
int ret = 0;
{
if (l->ie == ie)
{
- preload = eina_inlist_remove(preload,
- EINA_INLIST_GET(l));
- free(l);
+ Evas_Cache_Target *tg;
+
+ if (target) {
+ EINA_INLIST_FOREACH(ie->targets, tg)
+ {
+ if (tg->target == target) {
+ ie->targets = (Evas_Cache_Target*) eina_inlist_remove(EINA_INLIST_GET(ie->targets), EINA_INLIST_GET(tg));
+ free(tg);
+ break;
+ }
+ }
+ } else {
+ _evas_cache_image_async_call(ie);
+
+ while (ie->targets)
+ {
+ tg = ie->targets;
+ ie->targets = (Evas_Cache_Target*) eina_inlist_remove(EINA_INLIST_GET(ie->targets), EINA_INLIST_GET(tg));
+ free(tg);
+ }
+ }
+
+ if (!ie->targets)
+ {
+ preload = eina_inlist_remove(preload,
+ EINA_INLIST_GET(l));
+ free(l);
+ }
+
break;
}
}
return ret;
}
-
-static void
-_evas_cache_image_async_call(Image_Entry *im)
-{
- pthread_mutex_lock(&mutex);
- while (im->targets)
- {
- Evas_Cache_Target *tmp = im->targets;
-
- evas_async_events_put(tmp->target, EVAS_CALLBACK_IMAGE_PRELOADED, NULL,
- (void (*)(void*, Evas_Callback_Type, void*))evas_object_event_callback_call);
- im->targets = (Evas_Cache_Target*) eina_inlist_remove(EINA_INLIST_GET(im->targets), EINA_INLIST_GET(im->targets));
- free(tmp);
- }
- pthread_mutex_unlock(&mutex);
-}
#endif
EAPI int
if (im->references == 0)
{
#ifdef BUILD_ASYNC_PRELOAD
- _evas_cache_image_entry_preload_remove(im);
+ _evas_cache_image_entry_preload_remove(im, NULL);
#endif
if (im->flags.dirty)
#ifdef BUILD_ASYNC_PRELOAD
int preload = im->flags.preload;
/* We check a first time, to prevent useless lock. */
- _evas_cache_image_entry_preload_remove(im);
+ _evas_cache_image_entry_preload_remove(im, NULL);
if (im->flags.loaded) return ;
pthread_mutex_lock(&im->lock);
#endif
}
EAPI void
-evas_cache_image_preload_cancel(Image_Entry *im)
+evas_cache_image_preload_cancel(Image_Entry *im, const void *target)
{
#ifdef BUILD_ASYNC_PRELOAD
Evas_Cache_Image *cache;
assert(im->cache);
cache = im->cache;
- _evas_cache_image_entry_preload_remove(im);
+ _evas_cache_image_entry_preload_remove(im, target);
#else
(void) im;
#endif
if (!o->engine_data)
obj->layer->evas->engine.func->image_data_preload_cancel(obj->layer->evas->engine.data.output,
- o->engine_data);
+ o->engine_data,
+ obj);
if (o->cur.file) eina_stringshare_del(o->cur.file);
if (o->cur.key) eina_stringshare_del(o->cur.key);
}
if (cancel)
obj->layer->evas->engine.func->image_data_preload_cancel(obj->layer->evas->engine.data.output,
- o->engine_data);
+ o->engine_data,
+ obj);
else
obj->layer->evas->engine.func->image_data_preload_request(obj->layer->evas->engine.data.output,
o->engine_data,
void *(*image_data_get) (void *data, void *image, int to_write, DATA32 **image_data);
void *(*image_data_put) (void *data, void *image, DATA32 *image_data);
void (*image_data_preload_request) (void *data, void *image, const void *target);
- void (*image_data_preload_cancel) (void *data, void *image);
+ void (*image_data_preload_cancel) (void *data, void *image, const void *target);
void *(*image_alpha_set) (void *data, void *image, int has_alpha);
int (*image_alpha_get) (void *data, void *image);
void *(*image_border_set) (void *data, void *image, int l, int r, int t, int b);
static void *eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h);
static void *eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data);
static void *eng_image_data_put(void *data, void *image, DATA32 *image_data);
-static void eng_image_data_preload_request(void *data, void *image, void *target);
-static void eng_image_data_preload_cancel(void *data, void *image);
+static void eng_image_data_preload_request(void *data, void *image, const void *target);
+static void eng_image_data_preload_cancel(void *data, void *image, const void *target);
static void *eng_image_alpha_set(void *data, void *image, int has_alpha);
static int eng_image_alpha_get(void *data, void *image);
static void *eng_image_border_set(void *data, void *image, int l, int r, int t, int b);
}
static void
-eng_image_data_preload_request(void *data, void *image, void *target)
+eng_image_data_preload_request(void *data, void *image, const void *target)
{
Render_Engine *re;
}
static void
-eng_image_data_preload_cancel(void *data, void *image)
+eng_image_data_preload_cancel(void *data, void *image, const void *target)
{
Render_Engine *re;
}
static void
-evas_engine_dfb_image_data_preload_request(void *data, void *image, void *target)
+evas_engine_dfb_image_data_preload_request(void *data, void *image, const void *target)
{
DirectFB_Engine_Image_Entry *deie = image;
RGBA_Image *im;
}
static void
-evas_engine_dfb_image_data_preload_cancel(void *data, void *image)
+evas_engine_dfb_image_data_preload_cancel(void *data, void *image, const void *target)
{
DirectFB_Engine_Image_Entry *deie = image;
RGBA_Image *im;
if (!deie) return ;
im = (RGBA_Image*) deie->cache_entry.src;
if (!im) return ;
- evas_cache_image_preload_cancel(&im->cache_entry);
+ evas_cache_image_preload_cancel(&im->cache_entry, target);
}
static void *
}
static void
-eng_image_data_preload_request(void *data, void *image, void *target)
+eng_image_data_preload_request(void *data, void *image, const void *target)
{
Evas_GL_Image *gim = image;
RGBA_Image *im;
}
static void
-eng_image_data_preload_cancel(void *data, void *image)
+eng_image_data_preload_cancel(void *data, void *image, const void *target)
{
Evas_GL_Image *gim = image;
RGBA_Image *im;
if (!gim) return ;
im = (RGBA_Image*) gim->im;
if (!im) return ;
- evas_cache_image_preload_cancel(&im->cache_entry);
+ evas_cache_image_preload_cancel(&im->cache_entry, target);
}
static void
}
static void
-eng_image_data_preload_request(void *data, void *image, void *target)
+eng_image_data_preload_request(void *data, void *image, const void *target)
{
Evas_GL_Image *gim = image;
RGBA_Image *im;
}
static void
-eng_image_data_preload_cancel(void *data, void *image)
+eng_image_data_preload_cancel(void *data, void *image, const void *target)
{
Evas_GL_Image *gim = image;
RGBA_Image *im;
if (!gim) return ;
im = (RGBA_Image*) gim->im;
if (!im) return ;
- evas_cache_image_preload_cancel(&im->cache_entry);
+ evas_cache_image_preload_cancel(&im->cache_entry, target);
}
static void
}
static void
-eng_image_data_preload_cancel(void *data, void *image)
+eng_image_data_preload_cancel(void *data, void *image, const void *target)
{
Soft16_Image *im = image;
if (!im) return ;
- evas_cache_image_preload_cancel(&im->cache_entry);
+ evas_cache_image_preload_cancel(&im->cache_entry, target);
}
static void
}
static void
-evas_engine_sdl16_image_data_preload_cancel(void *data, void *image)
+evas_engine_sdl16_image_data_preload_cancel(void *data, void *image, const void *target)
{
SDL_Engine_Image_Entry *eim = image;
Soft16_Image *im;
if (!eim) return ;
im = (Soft16_Image *) eim->cache_entry.src;
if (!im) return ;
- evas_cache_image_preload_cancel(&im->cache_entry);
+ evas_cache_image_preload_cancel(&im->cache_entry, target);
}
static void*
}
static void
-eng_image_data_preload_cancel(void *data, void *image)
+eng_image_data_preload_cancel(void *data, void *image, const void *target)
{
RGBA_Image *im = image;
if (!im) return ;
- evas_cache_image_preload_cancel(&im->cache_entry);
+ evas_cache_image_preload_cancel(&im->cache_entry, target);
}
static void
}
static void
-evas_engine_sdl_image_data_preload_cancel(void *data, void *image)
+evas_engine_sdl_image_data_preload_cancel(void *data, void *image, const void *target)
{
SDL_Engine_Image_Entry *eim = image;
RGBA_Image *im;
if (!eim) return ;
im = (RGBA_Image*) eim->cache_entry.src;
if (!im) return ;
- evas_cache_image_preload_cancel(&im->cache_entry);
+ evas_cache_image_preload_cancel(&im->cache_entry, target);
}
static void*
}
static void
-eng_image_data_preload_cancel(void *data, void *image)
+eng_image_data_preload_cancel(void *data, void *image, const void *target)
{
XR_Image *xim = image;
RGBA_Image *im;
if (!xim) return ;
im = (RGBA_Image*) xim->im;
if (!im) return ;
- evas_cache_image_preload_cancel(&im->cache_entry);
+ evas_cache_image_preload_cancel(&im->cache_entry, target);
}
static void