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);
      }

-- 


Reply via email to