evas: hopefully the last clip bug fix.
authorcedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 21 Mar 2011 15:18:26 +0000 (15:18 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 21 Mar 2011 15:18:26 +0000 (15:18 +0000)
If no one see breakage due to this, I will backport all of them in two days.

git-svn-id: http://svn.enlightenment.org/svn/e/trunk/evas@57934 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/canvas/evas_clip.c
src/lib/canvas/evas_render.c
src/lib/include/evas_inline.x

index 88defd6..08bd86e 100644 (file)
@@ -7,6 +7,8 @@ evas_object_clip_dirty(Evas_Object *obj)
    Eina_List *l;
    Evas_Object *data;
 
+   if (obj->cur.cache.clip.dirty) return ;
+
    obj->cur.cache.clip.dirty = 1;
    EINA_LIST_FOREACH(obj->clip.clipees, l, data)
      evas_object_clip_dirty(data);
index 7dc2a7b..877cf6c 100644 (file)
@@ -881,21 +881,6 @@ evas_render_mapped(Evas *e, Evas_Object *obj, void *context, void *surface,
                                      obj->cur.geometry.w,
                                      obj->cur.geometry.h);
 
-                  if (obj->cur.clipper)
-                    {
-                       if (_evas_render_has_map(obj))
-                         evas_object_clip_recalc(obj);
-                       RECTS_CLIP_TO_RECT(x, y, w, h,
-                                          obj->cur.cache.clip.x + off_x,
-                                          obj->cur.cache.clip.y + off_y,
-                                          obj->cur.cache.clip.w,
-                                          obj->cur.cache.clip.h);
-                       RECTS_CLIP_TO_RECT(x, y, w, h,
-                                          obj->cur.clipper->cur.cache.clip.x + off_x,
-                                          obj->cur.clipper->cur.cache.clip.y + off_y,
-                                          obj->cur.clipper->cur.cache.clip.w,
-                                          obj->cur.clipper->cur.cache.clip.h);
-                    }
                   e->engine.func->context_clip_set(e->engine.data.output,
                                                    ctx, x, y, w, h);
                   obj->func->render(obj, e->engine.data.output, ctx,
@@ -1126,10 +1111,10 @@ evas_render_updates_internal(Evas *e,
 
    /* phase 1. add extra updates for changed objects */
    if (e->invalidate || e->render_objects.count <= 0)
-     clean_them = _evas_render_phase1_process(e, 
-                                              &e->active_objects, 
-                                              &e->restack_objects, 
-                                              &e->delete_objects, 
+     clean_them = _evas_render_phase1_process(e,
+                                              &e->active_objects,
+                                              &e->restack_objects,
+                                              &e->delete_objects,
                                               &e->render_objects,
                                               &redraw_all);
 
index 07db736..f1d131d 100644 (file)
@@ -204,28 +204,33 @@ evas_object_clip_recalc(Evas_Object *obj)
    else cvis = obj->cur.visible;
    cr = obj->cur.color.r; cg = obj->cur.color.g;
    cb = obj->cur.color.b; ca = obj->cur.color.a;
-   if ((obj->cur.clipper) &&
-       (obj->cur.clipper->cur.map_parent == obj->cur.map_parent))
+   if (obj->cur.clipper)
      {
 // this causes problems... hmmm
-       if (obj->cur.clipper->cur.cache.clip.dirty)
-         evas_object_clip_recalc(obj->cur.clipper);
-       nx = obj->cur.clipper->cur.cache.clip.x;
-       ny = obj->cur.clipper->cur.cache.clip.y;
-       nw = obj->cur.clipper->cur.cache.clip.w;
-       nh = obj->cur.clipper->cur.cache.clip.h;
-       RECTS_CLIP_TO_RECT(cx, cy, cw, ch, nx, ny, nw, nh);
-
-       nvis = obj->cur.clipper->cur.cache.clip.visible;
-       nr = obj->cur.clipper->cur.cache.clip.r;
-       ng = obj->cur.clipper->cur.cache.clip.g;
-       nb = obj->cur.clipper->cur.cache.clip.b;
-       na = obj->cur.clipper->cur.cache.clip.a;
-       cvis = cvis * nvis;
-       cr = (cr * (nr + 1)) >> 8;
-       cg = (cg * (ng + 1)) >> 8;
-       cb = (cb * (nb + 1)) >> 8;
-       ca = (ca * (na + 1)) >> 8;
+        if (obj->cur.clipper->cur.cache.clip.dirty)
+          evas_object_clip_recalc(obj->cur.clipper);
+
+        // I don't know why this test was here in the first place. As I have
+        // no issue showing up due to this, I keep it and move color out of it.
+        if (obj->cur.clipper->cur.map_parent == obj->cur.map_parent)
+          {
+             nx = obj->cur.clipper->cur.cache.clip.x;
+             ny = obj->cur.clipper->cur.cache.clip.y;
+             nw = obj->cur.clipper->cur.cache.clip.w;
+             nh = obj->cur.clipper->cur.cache.clip.h;
+             RECTS_CLIP_TO_RECT(cx, cy, cw, ch, nx, ny, nw, nh);
+          }
+
+        nvis = obj->cur.clipper->cur.cache.clip.visible;
+        nr = obj->cur.clipper->cur.cache.clip.r;
+        ng = obj->cur.clipper->cur.cache.clip.g;
+        nb = obj->cur.clipper->cur.cache.clip.b;
+        na = obj->cur.clipper->cur.cache.clip.a;
+        cvis = cvis * nvis;
+        cr = (cr * (nr + 1)) >> 8;
+        cg = (cg * (ng + 1)) >> 8;
+        cb = (cb * (nb + 1)) >> 8;
+        ca = (ca * (na + 1)) >> 8;
      }
    if ((ca == 0 && obj->cur.render_op == EVAS_RENDER_BLEND) || (cw <= 0) || (ch <= 0)) cvis = 0;
    obj->cur.cache.clip.x = cx;