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,7 +67,8 @@ evas_object_change(Evas_Object *obj)
|
||||||
{
|
{
|
||||||
Eina_List *l;
|
Eina_List *l;
|
||||||
Evas_Object *obj2;
|
Evas_Object *obj2;
|
||||||
|
Eina_Bool movch = 0;
|
||||||
|
|
||||||
if (obj->layer->evas->nochange)
|
if (obj->layer->evas->nochange)
|
||||||
{
|
{
|
||||||
// printf("nochange %p\n", obj);
|
// printf("nochange %p\n", obj);
|
||||||
|
@ -76,11 +77,26 @@ evas_object_change(Evas_Object *obj)
|
||||||
// else
|
// else
|
||||||
// printf("ch %p\n", obj);
|
// printf("ch %p\n", obj);
|
||||||
obj->layer->evas->changed = 1;
|
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;
|
// obj->changed = 1;
|
||||||
evas_render_object_recalc(obj);
|
evas_render_object_recalc(obj);
|
||||||
/* set changed flag on all objects this one clips too */
|
/* 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);
|
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.x = x;
|
||||||
obj->cur.geometry.y = y;
|
obj->cur.geometry.y = y;
|
||||||
//// obj->cur.cache.geometry.validity = 0;
|
//// obj->cur.cache.geometry.validity = 0;
|
||||||
|
obj->changed_move = 1;
|
||||||
evas_object_change(obj);
|
evas_object_change(obj);
|
||||||
evas_object_clip_dirty(obj);
|
evas_object_clip_dirty(obj);
|
||||||
obj->doing.in_move--;
|
obj->doing.in_move--;
|
||||||
|
|
|
@ -607,9 +607,56 @@ pending_change(void *data, void *gdata __UNUSED__)
|
||||||
obj->pre_render_done = 0;
|
obj->pre_render_done = 0;
|
||||||
//// FIXME: this wipes out changes
|
//// FIXME: this wipes out changes
|
||||||
obj->changed = 0;
|
obj->changed = 0;
|
||||||
|
obj->changed_move_only = 0;
|
||||||
|
obj->changed_nomove = 0;
|
||||||
|
obj->changed_move = 0;
|
||||||
}
|
}
|
||||||
return obj->changed ? EINA_TRUE : EINA_FALSE;
|
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
|
static Eina_Bool
|
||||||
evas_render_mapped(Evas *e, Evas_Object *obj, void *context, void *surface,
|
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))
|
!evas_object_was_visible(obj2))
|
||||||
{
|
{
|
||||||
obj2->changed = 0;
|
obj2->changed = 0;
|
||||||
|
obj2->changed_move_only = 0;
|
||||||
|
obj2->changed_nomove = 0;
|
||||||
|
obj2->changed_move = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (obj2->changed)
|
if (obj2->changed)
|
||||||
{
|
{
|
||||||
obj2->changed = 0;
|
// chlist(obj2, 0);
|
||||||
changed = 1;
|
changed = 1;
|
||||||
|
obj2->changed = 0;
|
||||||
|
obj2->changed_move_only = 0;
|
||||||
|
obj2->changed_nomove = 0;
|
||||||
|
obj2->changed_move = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// unchange(obj);
|
||||||
obj->changed = 0;
|
obj->changed = 0;
|
||||||
|
obj->changed_move_only = 0;
|
||||||
|
obj->changed_nomove = 0;
|
||||||
|
obj->changed_move = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (obj->changed)
|
if (obj->changed)
|
||||||
{
|
{
|
||||||
obj->changed = 0;
|
|
||||||
changed = 1;
|
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->func->render_post(obj);
|
||||||
obj->restack = 0;
|
obj->restack = 0;
|
||||||
obj->changed = 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) ||
|
else if ((obj->cur.map != obj->prev.map) ||
|
||||||
(obj->cur.usemap != obj->prev.usemap))
|
(obj->cur.usemap != obj->prev.usemap))
|
||||||
|
@ -1314,6 +1378,9 @@ evas_render_updates_internal(Evas *e,
|
||||||
obj->func->render_post(obj);
|
obj->func->render_post(obj);
|
||||||
obj->restack = 0;
|
obj->restack = 0;
|
||||||
obj->changed = 0;
|
obj->changed = 0;
|
||||||
|
obj->changed_move_only = 0;
|
||||||
|
obj->changed_nomove = 0;
|
||||||
|
obj->changed_move = 0;
|
||||||
}
|
}
|
||||||
/* moved to other pre-process phase 1
|
/* moved to other pre-process phase 1
|
||||||
if (obj->delete_me == 2)
|
if (obj->delete_me == 2)
|
||||||
|
|
|
@ -460,9 +460,9 @@ struct _Evas_Object
|
||||||
Eina_Bool parent_cache_valid : 1;
|
Eina_Bool parent_cache_valid : 1;
|
||||||
Eina_Bool repeat_events : 1;
|
Eina_Bool repeat_events : 1;
|
||||||
Eina_Bool restack : 1;
|
Eina_Bool restack : 1;
|
||||||
Eina_Bool changed : 1;
|
|
||||||
Eina_Bool changed_move : 1;
|
|
||||||
Eina_Bool is_active : 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 render_pre : 1;
|
||||||
Eina_Bool rect_del : 1;
|
Eina_Bool rect_del : 1;
|
||||||
|
@ -473,8 +473,10 @@ struct _Evas_Object
|
||||||
Eina_Bool in_layer : 1;
|
Eina_Bool in_layer : 1;
|
||||||
Eina_Bool no_propagate : 1;
|
Eina_Bool no_propagate : 1;
|
||||||
|
|
||||||
Eina_Bool precise_is_inside : 1;
|
Eina_Bool changed : 1;
|
||||||
Eina_Bool is_static_clip : 1;
|
Eina_Bool changed_move : 1;
|
||||||
|
Eina_Bool changed_move_only : 1;
|
||||||
|
Eina_Bool changed_nomove : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _Evas_Func_Node
|
struct _Evas_Func_Node
|
||||||
|
|
Loading…
Reference in New Issue