fix over-render bug in map/mapbuf and with changed flags! that was

nasty to find!



SVN revision: 56220
This commit is contained in:
Carsten Haitzler 2011-01-19 11:59:53 +00:00
parent d95d5b5a82
commit 7957334611
3 changed files with 95 additions and 9 deletions

View 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--;

View 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)

View 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