fix over-render bug in map/mapbuf and with changed flags! that was
authorraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 19 Jan 2011 11:59:53 +0000 (11:59 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 19 Jan 2011 11:59:53 +0000 (11:59 +0000)
nasty to find!

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

src/lib/canvas/evas_object_main.c
src/lib/canvas/evas_render.c
src/lib/include/evas_private.h

index fe26a76..9332e66 100644 (file)
@@ -67,7 +67,8 @@ evas_object_change(Evas_Object *obj)
 {
    Eina_List *l;
    Evas_Object *obj2;
-
+   Eina_Bool movch = 0;
+   
    if (obj->layer->evas->nochange)
      {
 //        printf("nochange %p\n", obj);
@@ -76,11 +77,26 @@ evas_object_change(Evas_Object *obj)
 //   else
 //      printf("ch %p\n", obj);
    obj->layer->evas->changed = 1;
-   if (obj->changed) return;
+   if (obj->changed_move)
+     {
+        movch = 1;
+        obj->changed_move = 0;
+        if (!obj->changed_nomove) obj->changed_move_only = 1;
+        if (obj->changed) return;
+     }
+   else
+     {
+        obj->changed_move_only = 0;
+        obj->changed_nomove = 1;
+        if (obj->changed) return;
+     }
 //   obj->changed = 1;
    evas_render_object_recalc(obj);
    /* set changed flag on all objects this one clips too */
-   EINA_LIST_FOREACH(obj->clip.clipees, l, obj2) evas_object_change(obj2);
+   if (!((movch) && (obj->is_static_clip)))
+     {
+        EINA_LIST_FOREACH(obj->clip.clipees, l, obj2) evas_object_change(obj2);
+     }
    if (obj->smart.parent) evas_object_change(obj->smart.parent);
 }
 
@@ -437,6 +453,7 @@ evas_object_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
    obj->cur.geometry.x = x;
    obj->cur.geometry.y = y;
 ////   obj->cur.cache.geometry.validity = 0;
+   obj->changed_move = 1;
    evas_object_change(obj);
    evas_object_clip_dirty(obj);
    obj->doing.in_move--;
index 04f7d8c..3b2659e 100644 (file)
@@ -607,9 +607,56 @@ pending_change(void *data, void *gdata __UNUSED__)
         obj->pre_render_done = 0;
 //// FIXME: this wipes out changes
         obj->changed = 0;
+        obj->changed_move_only = 0;
+        obj->changed_nomove = 0;
+        obj->changed_move = 0;
      }
    return obj->changed ? EINA_TRUE : EINA_FALSE;
 }
+/*
+static void
+unchange(Evas_Object *obj)
+{
+   Evas_Object *obj2;
+
+   if (!obj->changed) return;
+   obj->changed = 0;
+   obj->changed_move_only = 0;
+   obj->changed_nomove = 0;
+   obj->changed_move = 0;
+   EINA_INLIST_FOREACH(evas_object_smart_members_get_direct(obj), obj2)
+     {
+        unchange(obj2);
+     }
+}
+
+static int
+chlist(Evas_Object *obj, int i)
+{
+   Evas_Object *obj2;
+   int j;
+   int ret = 0;
+
+   if (!obj->changed) return 0;
+   for (j = 0; j < i; j++) printf(" ");
+   printf("ch2 %p %s %i [%i %i %ix%i] v %i/%i [r%i] %p\n", obj, 
+          obj->type, 
+          obj->changed_move_only,
+          obj->cur.geometry.x,
+          obj->cur.geometry.y,
+          obj->cur.geometry.w,
+          obj->cur.geometry.h,
+          obj->cur.visible,
+          obj->prev.visible,
+          obj->restack,
+          obj->clip.clipees);
+   EINA_INLIST_FOREACH(evas_object_smart_members_get_direct(obj), obj2)
+     {
+        if (obj2->changed)
+           ret |= chlist(obj2, i + 1);
+     }
+}
+*/
 
 static Eina_Bool
 evas_render_mapped(Evas *e, Evas_Object *obj, void *context, void *surface,
@@ -725,23 +772,37 @@ evas_render_mapped(Evas *e, Evas_Object *obj, void *context, void *surface,
                       !evas_object_was_visible(obj2))
                     {
                        obj2->changed = 0;
+                       obj2->changed_move_only = 0;
+                       obj2->changed_nomove = 0;
+                       obj2->changed_move = 0;
                        continue;
                     }
                   if (obj2->changed)
                     {
-                       obj2->changed = 0;
+//                       chlist(obj2, 0);
                        changed = 1;
+                       obj2->changed = 0;
+                       obj2->changed_move_only = 0;
+                       obj2->changed_nomove = 0;
+                       obj2->changed_move = 0;
                        break;
                     }
                }
+//             unchange(obj);
              obj->changed = 0;
+             obj->changed_move_only = 0;
+             obj->changed_nomove = 0;
+             obj->changed_move = 0;
           }
         else
           {
              if (obj->changed)
                {
-                  obj->changed = 0;
                   changed = 1;
+                  obj->changed = 0;
+                  obj->changed_move_only = 0;
+                  obj->changed_nomove = 0;
+                  obj->changed_move = 0;
                }
           }
 
@@ -1306,6 +1367,9 @@ evas_render_updates_internal(Evas *e,
             obj->func->render_post(obj);
             obj->restack = 0;
             obj->changed = 0;
+             obj->changed_move_only = 0;
+             obj->changed_nomove = 0;
+             obj->changed_move = 0;
          }
         else if ((obj->cur.map != obj->prev.map) ||
                  (obj->cur.usemap != obj->prev.usemap))
@@ -1314,6 +1378,9 @@ evas_render_updates_internal(Evas *e,
             obj->func->render_post(obj);
             obj->restack = 0;
             obj->changed = 0;
+             obj->changed_move_only = 0;
+             obj->changed_nomove = 0;
+             obj->changed_move = 0;
           }
 /* moved to other pre-process phase 1
        if (obj->delete_me == 2)
index bff57f0..5e26777 100644 (file)
@@ -460,9 +460,9 @@ struct _Evas_Object
    Eina_Bool                   parent_cache_valid : 1;
    Eina_Bool                   repeat_events : 1;
    Eina_Bool                   restack : 1;
-   Eina_Bool                   changed : 1;
-   Eina_Bool                   changed_move : 1;
    Eina_Bool                   is_active : 1;
+   Eina_Bool                   precise_is_inside : 1;
+   Eina_Bool                   is_static_clip : 1;
 
    Eina_Bool                   render_pre : 1;
    Eina_Bool                   rect_del : 1;
@@ -473,8 +473,10 @@ struct _Evas_Object
    Eina_Bool                   in_layer : 1;
    Eina_Bool                   no_propagate : 1;
 
-   Eina_Bool                   precise_is_inside : 1;
-   Eina_Bool                   is_static_clip : 1;
+   Eina_Bool                   changed : 1;
+   Eina_Bool                   changed_move : 1;
+   Eina_Bool                   changed_move_only : 1;
+   Eina_Bool                   changed_nomove : 1;
 };
 
 struct _Evas_Func_Node