jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=a688ba45c88b74ea6c4543a24a060d41ef2a33d5

commit a688ba45c88b74ea6c4543a24a060d41ef2a33d5
Author: Jean-Philippe Andre <jp.an...@samsung.com>
Date:   Wed Feb 4 12:08:50 2015 +0900

    Evas masking: Fix some remaining issues with animations
    
    Yeah, mixing maps and masks of masks in a genlist leads
    to tons of amazing bugs :)
    
    This commit removes x,y from the "mask" field in an object,
    as they are duplicates of cur->geometry.{x,y} but were not
    properly kept in sync.
    
    This patch fixes a situation of:
    - A genlist in a map
    - Each item has an icon masked
    - Scrolling the genlist
    --> The masked items would not render properly before this
        patch.
    
    Remaining known problem:
    - Mask a genlist (big mask)
    - Each item has an icon masked (small mask)
    - Apply a map to the genlist
    - Scrolling the genlist
    --> The big mask still works but totally screws up the
        small icons with masks.
    
    Note: These changes look scary just before the release
          but I would have to backport them to 1.13.x as they
          definitely are bug fixes. Also, they only concern
          code paths used exclusively by masking.
---
 src/lib/evas/canvas/evas_clip.c        |  2 --
 src/lib/evas/canvas/evas_object_main.c |  6 +++---
 src/lib/evas/canvas/evas_render.c      | 35 ++++++++++++++++++++--------------
 src/lib/evas/include/evas_private.h    |  2 +-
 4 files changed, 25 insertions(+), 20 deletions(-)

diff --git a/src/lib/evas/canvas/evas_clip.c b/src/lib/evas/canvas/evas_clip.c
index 0816664..0e1d43a 100644
--- a/src/lib/evas/canvas/evas_clip.c
+++ b/src/lib/evas/canvas/evas_clip.c
@@ -205,8 +205,6 @@ _evas_object_clip_mask_unset(Evas_Object_Protected_Data 
*obj)
                 (obj->layer->evas->engine.data.output, mask->surface);
           mask->surface = NULL;
        }
-     mask->x = 0;
-     mask->y = 0;
      mask->w = 0;
      mask->h = 0;
    EINA_COW_WRITE_END(evas_object_mask_cow, obj->mask, mask);
diff --git a/src/lib/evas/canvas/evas_object_main.c 
b/src/lib/evas/canvas/evas_object_main.c
index 4e1237f..da97914 100644
--- a/src/lib/evas/canvas/evas_object_main.c
+++ b/src/lib/evas/canvas/evas_object_main.c
@@ -185,7 +185,7 @@ evas_object_free(Evas_Object *eo_obj, int clean_layer)
           mask->is_mask = EINA_FALSE;
           mask->redraw = EINA_FALSE;
           mask->is_alpha = EINA_FALSE;
-          mask->x = mask->y = mask->w = mask->h = 0;
+          mask->w = mask->h = 0;
           if (mask->surface)
             {
                obj->layer->evas->engine.func->image_map_surface_free
@@ -1264,14 +1264,14 @@ _hide(Evas_Object *eo_obj, Evas_Object_Protected_Data 
*obj)
    if (obj->mask->is_mask)
      {
         if (obj->mask->surface ||
-            obj->mask->x || obj->mask->y || obj->mask->w || obj->mask->h ||
+            obj->mask->w || obj->mask->h ||
             obj->mask->is_alpha || obj->mask->redraw)
           {
              EINA_COW_WRITE_BEGIN(evas_object_mask_cow, obj->mask,
                                   Evas_Object_Mask_Data, mask)
                mask->redraw = EINA_FALSE;
                mask->is_alpha = EINA_FALSE;
-               mask->x = mask->y = mask->w = mask->h = 0;
+               mask->w = mask->h = 0;
                if (mask->surface)
                  {
                     obj->layer->evas->engine.func->image_map_surface_free
diff --git a/src/lib/evas/canvas/evas_render.c 
b/src/lib/evas/canvas/evas_render.c
index 9f78e55..b0fc2d1 100644
--- a/src/lib/evas/canvas/evas_render.c
+++ b/src/lib/evas/canvas/evas_render.c
@@ -1494,9 +1494,9 @@ evas_render_mapped(Evas_Public_Data *e, Evas_Object 
*eo_obj,
 
         if (mapped)
           {
-             Eina_Bool restore_image_clip = EINA_FALSE;
+             Eina_Bool restore_image_clip = EINA_FALSE, old_use_clip = 
EINA_FALSE;
+             int oldm_x = 0, oldm_y = 0, ocx = 0, ocy = 0, ocw = 0, och = 0;
              void *oldm_sfc = NULL;
-             int oldm_x = 0, oldm_y = 0;
 
              RDI(level);
              RD("        draw child of mapped obj\n");
@@ -1524,11 +1524,14 @@ evas_render_mapped(Evas_Public_Data *e, Evas_Object 
*eo_obj,
                             e->engine.func->context_clip_image_get
                                   (e->engine.data.output, ctx,
                                    &oldm_sfc, &oldm_x, &oldm_y);
+                            old_use_clip = e->engine.func->context_clip_get
+                                  (e->engine.data.output, ctx,
+                                   &ocx, &ocy, &ocw, &och);
                             e->engine.func->context_clip_image_set
                                   (e->engine.data.output, ctx,
                                    mask->mask->surface,
-                                   mask->mask->x + off_x,
-                                   mask->mask->y + off_y);
+                                   mask->cur->geometry.x + off_x,
+                                   mask->cur->geometry.y + off_y);
                          }
                     }
 
@@ -1579,11 +1582,14 @@ evas_render_mapped(Evas_Public_Data *e, Evas_Object 
*eo_obj,
                                  e->engine.func->context_clip_image_get
                                        (e->engine.data.output, ctx,
                                         &oldm_sfc, &oldm_x, &oldm_y);
+                                 old_use_clip = 
e->engine.func->context_clip_get
+                                       (e->engine.data.output, ctx,
+                                        &ocx, &ocy, &ocw, &och);
                                  e->engine.func->context_clip_image_set
                                        (e->engine.data.output, ctx,
                                         mask->mask->surface,
-                                        mask->mask->x + off_x,
-                                        mask->mask->y + off_y);
+                                        mask->cur->geometry.x + off_x,
+                                        mask->cur->geometry.y + off_y);
                               }
                          }
                     }
@@ -1593,6 +1599,10 @@ evas_render_mapped(Evas_Public_Data *e, Evas_Object 
*eo_obj,
                }
              if (restore_image_clip)
                {
+                  if (old_use_clip)
+                    e->engine.func->context_clip_set(e->engine.data.output, 
ctx, ocx, ocy, ocw, och);
+                  else
+                    e->engine.func->context_clip_unset(e->engine.data.output, 
ctx);
                   e->engine.func->context_clip_image_set
                     (e->engine.data.output, ctx, oldm_sfc, oldm_x, oldm_y);
                }
@@ -1791,14 +1801,11 @@ evas_render_mask_subrender(Evas_Public_Data *evas,
        {
           mdata->surface = ENFN->image_map_surface_new(ENDT, w, h, EINA_TRUE);
           if (!mdata->surface) goto end;
+          mdata->is_alpha = EINA_FALSE;
           mdata->w = w;
           mdata->h = h;
        }
 
-     mdata->x = x;
-     mdata->y = y;
-     mdata->is_alpha = EINA_FALSE;
-
      /* Clear surface with transparency */
      ctx = ENFN->context_new(ENDT);
      ENFN->context_color_set(ENDT, ctx, 0, 0, 0, 0);
@@ -1812,8 +1819,8 @@ evas_render_mask_subrender(Evas_Public_Data *evas,
        {
           ENFN->context_clip_image_set(ENDT, ctx,
                                        prev_mask->mask->surface,
-                                       prev_mask->mask->x - x,
-                                       prev_mask->mask->y - y);
+                                       prev_mask->cur->geometry.x - x,
+                                       prev_mask->cur->geometry.y - y);
        }
      evas_render_mapped(evas, mask->object, mask, ctx, mdata->surface,
                         -x, -y, 1, 0, 0, evas->output.w, evas->output.h,
@@ -2348,8 +2355,8 @@ evas_render_updates_internal(Evas *eo_e,
                                             (e->engine.data.output,
                                              e->engine.data.context,
                                              mask->mask->surface,
-                                             mask->mask->x + off_x,
-                                             mask->mask->y + off_y);
+                                             mask->cur->geometry.x + off_x,
+                                             mask->cur->geometry.y + off_y);
                                    }
                               }
 
diff --git a/src/lib/evas/include/evas_private.h 
b/src/lib/evas/include/evas_private.h
index 10c918e..673b6aa 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -895,7 +895,7 @@ struct _Evas_Object_3D_Data
 struct _Evas_Object_Mask_Data
 {
    void          *surface;
-   int            x, y, w, h;
+   int            w, h;
    Eina_Bool      is_mask : 1;
    Eina_Bool      redraw : 1;
    Eina_Bool      is_alpha : 1;

-- 


Reply via email to