jpeg pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=04ba5a3b994d0e513fefa2888e69ee6ffb919fc4
commit 04ba5a3b994d0e513fefa2888e69ee6ffb919fc4 Author: Jean-Philippe Andre <jp.an...@samsung.com> Date: Thu Jan 22 17:55:04 2015 +0900 Evas masking: Aaaand fix another series of memleaks Don't inc-ref more than we can dec-ref. --- src/modules/evas/engines/gl_generic/evas_engine.c | 23 +++++++++++++++------- .../evas/engines/software_generic/evas_engine.c | 22 ++++++++++++++------- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/modules/evas/engines/gl_generic/evas_engine.c b/src/modules/evas/engines/gl_generic/evas_engine.c index 66d98c4..198b638 100644 --- a/src/modules/evas/engines/gl_generic/evas_engine.c +++ b/src/modules/evas/engines/gl_generic/evas_engine.c @@ -1727,9 +1727,15 @@ eng_context_clip_image_set(void *data EINA_UNUSED, void *context, void *surface, { RGBA_Draw_Context *ctx = context; Evas_GL_Image *im = surface; + Eina_Bool noinc = EINA_FALSE; - if (ctx->clip.mask && ctx->clip.mask != surface) - eng_context_clip_image_unset(data, context); + if (ctx->clip.mask) + { + if (ctx->clip.mask != surface) + eng_context_clip_image_unset(data, context); + else + noinc = EINA_TRUE; + } ctx->clip.mask = surface; ctx->clip.mask_x = x; @@ -1738,18 +1744,21 @@ eng_context_clip_image_set(void *data EINA_UNUSED, void *context, void *surface, if (EINA_UNLIKELY(im && im->im)) { // Unlikely to happen because masks are render surfaces. + if (!noinc) + { #ifdef EVAS_CSERVE2 - if (evas_cserve2_use_get()) - evas_cache2_image_ref(&im->im->cache_entry); - else + if (evas_cserve2_use_get()) + evas_cache2_image_ref(&im->im->cache_entry); + else #endif - evas_cache_image_ref(&im->im->cache_entry); + evas_cache_image_ref(&im->im->cache_entry); + } RECTS_CLIP_TO_RECT(ctx->clip.x, ctx->clip.y, ctx->clip.w, ctx->clip.h, x, y, im->im->cache_entry.w, im->im->cache_entry.h); } else if (im) { - im->references++; + if (!noinc) im->references++; RECTS_CLIP_TO_RECT(ctx->clip.x, ctx->clip.y, ctx->clip.w, ctx->clip.h, x, y, im->w, im->h); } diff --git a/src/modules/evas/engines/software_generic/evas_engine.c b/src/modules/evas/engines/software_generic/evas_engine.c index 4ddf80a..50b3e98 100644 --- a/src/modules/evas/engines/software_generic/evas_engine.c +++ b/src/modules/evas/engines/software_generic/evas_engine.c @@ -440,9 +440,15 @@ static void eng_context_clip_image_set(void *data EINA_UNUSED, void *context, void *surface, int x, int y) { RGBA_Draw_Context *ctx = context; + Eina_Bool noinc = EINA_FALSE; - if (ctx->clip.mask && ctx->clip.mask != surface) - eng_context_clip_image_unset(data, context); + if (ctx->clip.mask) + { + if (ctx->clip.mask != surface) + eng_context_clip_image_unset(data, context); + else + noinc = EINA_TRUE; + } ctx->clip.mask = surface; ctx->clip.mask_x = x; @@ -451,13 +457,15 @@ eng_context_clip_image_set(void *data EINA_UNUSED, void *context, void *surface, if (surface) { Image_Entry *ie = surface; + if (!noinc) + { #ifdef EVAS_CSERVE2 - if (evas_cserve2_use_get()) - evas_cache2_image_ref(ie); - else + if (evas_cserve2_use_get()) + evas_cache2_image_ref(ie); + else #endif - evas_cache_image_ref(ie); - + evas_cache_image_ref(ie); + } RECTS_CLIP_TO_RECT(ctx->clip.x, ctx->clip.y, ctx->clip.w, ctx->clip.h, x, y, ie->w, ie->h); } --