forked from enlightenment/efl
fix over-render bug in map/mapbuf and with changed flags! that was
nasty to find! SVN revision: 56220
This commit is contained in:
parent
d95d5b5a82
commit
7957334611
|
@ -67,6 +67,7 @@ evas_object_change(Evas_Object *obj)
|
|||
{
|
||||
Eina_List *l;
|
||||
Evas_Object *obj2;
|
||||
Eina_Bool movch = 0;
|
||||
|
||||
if (obj->layer->evas->nochange)
|
||||
{
|
||||
|
@ -76,11 +77,26 @@ evas_object_change(Evas_Object *obj)
|
|||
// else
|
||||
// printf("ch %p\n", obj);
|
||||
obj->layer->evas->changed = 1;
|
||||
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 */
|
||||
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--;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue