Enlightenment CVS committal

Author  : cedric
Project : e17
Module  : libs/evas

Dir     : e17/libs/evas/src/lib/canvas


Modified Files:
        evas_main.c evas_render.c 


Log Message:
Fix osbcuring case with evas_render cache.


===================================================================
RCS file: /cvs/e/e17/libs/evas/src/lib/canvas/evas_main.c,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -3 -r1.43 -r1.44
--- evas_main.c 26 May 2008 13:24:24 -0000      1.43
+++ evas_main.c 4 Jun 2008 16:42:39 -0000       1.44
@@ -68,6 +68,8 @@
    evas_array_setup(&e->restack_objects, 16);
    evas_array_setup(&e->render_objects, 16);
    evas_array_setup(&e->pending_objects, 16);
+   evas_array_setup(&e->obscuring_objects, 16);
+   evas_array_setup(&e->temporary_objects, 16);
 
    return e;
 }
@@ -97,6 +99,7 @@
    if (e->walking_list > 0) return;
    del = 1;
    e->walking_list++;
+   e->cleanup = 1;
    while (del)
      {
        del = 0;
@@ -172,6 +175,8 @@
    evas_array_flush(&e->restack_objects);
    evas_array_flush(&e->render_objects);
    evas_array_flush(&e->pending_objects);
+   evas_array_flush(&e->obscuring_objects);
+   evas_array_flush(&e->temporary_objects);
 
    e->magic = 0;
    free(e);
@@ -368,6 +373,7 @@
    e->output.changed = 1;
    e->output_validity++;
    e->changed = 1;
+   evas_render_invalidate(e);
 }
 
 /**
===================================================================
RCS file: /cvs/e/e17/libs/evas/src/lib/canvas/evas_render.c,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -3 -r1.29 -r1.30
--- evas_render.c       26 May 2008 13:24:24 -0000      1.29
+++ evas_render.c       4 Jun 2008 16:42:39 -0000       1.30
@@ -242,60 +242,89 @@
 
        obj = _evas_array_get(pending_objects, i);
 
-       if (obj->render_pre
-           || obj->rect_del)
-         {
-            evas_object_clip_recalc(obj);
-            is_active = evas_object_is_active(obj);
+       evas_object_clip_recalc(obj);
+       is_active = evas_object_is_active(obj);
 
-            if (obj->is_active == is_active)
-              {
-                 if (obj->changed)
-                   {
-                      if (obj->smart.smart)
-                        ok = 1;
-                      else
-                        if ((is_active) && (obj->restack) && 
(!obj->clip.clipees) &&
-                            ((evas_object_is_visible(obj) && 
(!obj->cur.have_clipees)) || 
-                             (evas_object_was_visible(obj) && 
(!obj->prev.have_clipees))))
-                          ok = 0;
-                        else
-                          if (is_active && (!obj->clip.clipees) &&
-                              ((evas_object_is_visible(obj) && 
(!obj->cur.have_clipees)) ||
-                               (evas_object_was_visible(obj) && 
(!obj->prev.have_clipees))))
+       if (!is_active && !obj->is_active && !obj->render_pre && !obj->rect_del)
+         ok = 1;
+       else
+         if (obj->is_active == is_active)
+           {
+              if (obj->changed)
+                {
+                   if (obj->smart.smart)
+                     {
+                        if (obj->render_pre
+                            || obj->rect_del)
+                          ok = 1;
+                     }
+                   else
+                     if ((is_active) && (obj->restack) && (!obj->clip.clipees) 
&&
+                         ((evas_object_is_visible(obj) && 
(!obj->cur.have_clipees)) ||
+                          (evas_object_was_visible(obj) && 
(!obj->prev.have_clipees))))
+                       {
+                          if (!(obj->render_pre
+                                || obj->rect_del))
                             ok = 1;
-                   }
-                 else
-                   {
-                      if ((!obj->clip.clipees) && (obj->delete_me == 0) &&
-                          (!obj->cur.have_clipees || 
(evas_object_was_visible(obj) && (!obj->prev.have_clipees)))
-                          && evas_object_is_opaque(obj) && 
evas_object_is_visible(obj))
-                        if (obj->rect_del || obj->smart.smart)
+                       }
+                     else
+                       if (is_active && (!obj->clip.clipees) &&
+                           ((evas_object_is_visible(obj) && 
(!obj->cur.have_clipees)) ||
+                            (evas_object_was_visible(obj) && 
(!obj->prev.have_clipees))))
+                         {
+                            if (obj->render_pre
+                                || obj->rect_del)
+                              ok = 1;
+                         }
+                }
+              else
+                {
+                   if ((!obj->clip.clipees) && (obj->delete_me == 0) &&
+                       (!obj->cur.have_clipees || 
(evas_object_was_visible(obj) && (!obj->prev.have_clipees)))
+                       && evas_object_is_opaque(obj) && 
evas_object_is_visible(obj))
+                     if (obj->rect_del || obj->smart.smart)
+                       {
                           ok = 1;
-                   }
-              }
-         }
+                       }
+                }
+           }
 
        if (!ok)
          {
-            evas_render_invalidate(e);
+            evas_array_clean(&e->active_objects);
+            evas_array_clean(&e->render_objects);
+
+            evas_array_clean(&e->restack_objects);
+            evas_array_clean(&e->delete_objects);
+
+            e->invalidate = 1;
+
             return ;
          }
      }
 }
 
+Evas_Bool pending_change(void *data, void *gdata)
+{
+   Evas_Object *obj;
+
+   obj = data;
+
+   if (obj->delete_me) return 0;
+
+   return obj->changed ? 1 : 0;
+}
+
 static Evas_List *
 evas_render_updates_internal(Evas *e, unsigned char make_updates, unsigned 
char do_draw)
 {
    Evas_List *updates = NULL;
-   Evas_List *obscuring_objects = NULL;
-   Evas_List *obscuring_objects_orig = NULL;
    Evas_List *ll;
    void *surface;
    Evas_Bool clean_them = 0;
    int ux, uy, uw, uh;
    int cx, cy, cw, ch;
-   unsigned int i;
+   unsigned int i, j;
 
    MAGIC_CHECK(e, Evas, MAGIC_EVAS);
    return NULL;
@@ -303,14 +332,11 @@
    if (!e->changed) return NULL;
 
    /* Check if the modified object mean recalculating every thing */
-   if (&e->pending_objects.count > 0)
-     {
-       _evas_render_check_pending_objects(&e->pending_objects, e);
-       evas_array_clean(&e->pending_objects);
-     }
+   if (!e->invalidate)
+     _evas_render_check_pending_objects(&e->pending_objects, e);
 
    /* phase 1. add extra updates for changed objects */
-   if (e->render_objects.count <= 0)
+   if (e->invalidate || e->render_objects.count <= 0)
      clean_them = _evas_render_phase1_process(e, &e->active_objects, 
&e->restack_objects, &e->delete_objects, &e->render_objects);
 
    _evas_render_phase1_direct(e, &e->render_objects);
@@ -386,14 +412,17 @@
                      (!obj->delete_me) &&
                      (obj->cur.cache.clip.visible) &&
                      (!obj->smart.smart)))
-         obscuring_objects = evas_list_append(obscuring_objects, obj);
+/*       obscuring_objects = evas_list_append(obscuring_objects, obj); */
+         _evas_array_append(&e->obscuring_objects, obj);
      }
    /* save this list */
-   obscuring_objects_orig = obscuring_objects;
-   obscuring_objects = NULL;
+/*    obscuring_objects_orig = obscuring_objects; */
+/*    obscuring_objects = NULL; */
    /* phase 6. go thru each update rect and render objects in it*/
    if (do_draw)
      {
+       unsigned int offset = 0;
+
        while ((surface =
                
e->engine.func->output_redraws_next_update_get(e->engine.data.output,
                                                               &ux, &uy, &uw, 
&uh,
@@ -415,19 +444,18 @@
             off_x = cx - ux;
             off_y = cy - uy;
             /* build obscuring objects list (in order from bottom to top) */
-            for (ll = obscuring_objects_orig; ll; ll = ll->next)
+            for (i = 0; i < e->obscuring_objects.count; ++i)
               {
                  Evas_Object *obj;
 
-                 obj = (Evas_Object *)(ll->data);
+                 obj = (Evas_Object *) _evas_array_get(&e->obscuring_objects, 
i);
                  if (evas_object_is_in_output_rect(obj, ux, uy, uw, uh))
-                   obscuring_objects = evas_list_append(obscuring_objects, 
obj);
+                   _evas_array_append(&e->temporary_objects, obj);
               }
             /* render all object that intersect with rect */
              for (i = 0; i < e->active_objects.count; ++i)
               {
                  Evas_Object *obj;
-                 Evas_List *l3;
 
                  obj = _evas_array_get(&e->active_objects, i);
 
@@ -442,9 +470,9 @@
                    {
                       int x, y, w, h;
 
-                      if ((obscuring_objects) &&
-                          (obscuring_objects->data == obj))
-                        obscuring_objects = 
evas_list_remove(obscuring_objects, obj);
+                      if ((e->temporary_objects.count > offset) &&
+                          (_evas_array_get(&e->temporary_objects, offset) == 
obj))
+                        offset++;
                       x = cx; y = cy; w = cw; h = ch;
                       RECTS_CLIP_TO_RECT(x, y, w, h,
                                          obj->cur.cache.clip.x + off_x,
@@ -472,11 +500,11 @@
                                                             
e->engine.data.context,
                                                             x, y, w, h);
 #if 1 /* FIXME: this can slow things down... figure out optimum... coverage */
-                           for (l3 = obscuring_objects; l3; l3 = l3->next)
+                           for (j = offset; j < e->temporary_objects.count; 
++j)
                              {
                                 Evas_Object *obj2;
 
-                                obj2 = (Evas_Object *)l3->data;
+                                obj2 = (Evas_Object *) 
_evas_array_get(&e->temporary_objects, j);
                                 
e->engine.func->context_cutout_add(e->engine.data.output,
                                                                    
e->engine.data.context,
                                                                    
obj2->cur.cache.clip.x + off_x,
@@ -500,7 +528,7 @@
                                                             surface,
                                                             ux, uy, uw, uh);
             /* free obscuring objects list */
-            obscuring_objects = evas_list_free(obscuring_objects);
+            evas_array_clean(&e->temporary_objects);
          }
        /* flush redraws */
        e->engine.func->output_flush(e->engine.data.output);
@@ -529,7 +557,12 @@
  */
      }
    /* free our obscuring object list */
-   evas_list_free(obscuring_objects_orig);
+   evas_array_clean(&e->obscuring_objects);
+
+   /* If some object are still marked as changed, do not remove
+      them from the pending list. */
+   evas_array_remove(&e->pending_objects, pending_change, NULL);
+
    /* delete all objects flagged for deletion now */
    for (i = 0; i < e->delete_objects.count; ++i)
      {
@@ -538,14 +571,21 @@
        obj = _evas_array_get(&e->delete_objects, i);
        evas_object_free(obj, 1);
      }
-
-   /* If their are some object to restack or some object to delete, it's 
useless to keep the render object list around. */
-   if (clean_them)
-     evas_render_invalidate(e);
+   evas_array_clean(&e->delete_objects);
 
    e->changed = 0;
    e->viewport.changed = 0;
    e->output.changed = 0;
+   e->invalidate = 0;
+
+   /* If their are some object to restack or some object to delete, it's 
useless to keep the render object list around. */
+   if (clean_them)
+     {
+       evas_array_clean(&e->active_objects);
+       evas_array_clean(&e->render_objects);
+
+       e->invalidate = 1;
+     }
 
    evas_module_clean();
 
@@ -640,7 +680,12 @@
    evas_array_flush(&e->active_objects);
    evas_array_flush(&e->restack_objects);
    evas_array_flush(&e->render_objects);
-   evas_array_flush(&e->pending_objects);
+
+   /* If some object are still marked as changed, do not remove
+      them from the pending list. */
+   evas_array_remove(&e->pending_objects, pending_change, NULL);
+
+   e->invalidate = 1;
 }
 
 void
@@ -652,10 +697,15 @@
 
    evas_array_clean(&e->active_objects);
    evas_array_clean(&e->render_objects);
-   evas_array_clean(&e->pending_objects);
+
+   /* If some object are still marked as changed, do not remove
+      them from the pending list. */
+   evas_array_remove(&e->pending_objects, pending_change, NULL);
 
    evas_array_flush(&e->restack_objects);
    evas_array_flush(&e->delete_objects);
+
+   e->invalidate = 1;
 }
 
 void
@@ -665,15 +715,16 @@
    return;
    MAGIC_CHECK_END();
 
-   if (!obj->changed && obj->layer)
+   if (!obj->changed && obj->delete_me < 2)
      {
        Evas    *e;
 
        e = obj->layer->evas;
+       if (!e || e->cleanup) return ;
+
+       obj->changed = 1;
 
-       if (e->active_objects.count > 0
-           && e->render_objects.count > 0)
-         _evas_array_append(&e->pending_objects, obj);
+       _evas_array_append(&e->pending_objects, obj);
      }
 }
 



-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to