forked from enlightenment/efl
evas: do not call evas_object_change in reneder_post
Summary: evas_render_updates_internal > eina_array_remove is calling pending_change pending_change > render_post could call evas_object_change > evas_render_object_recalc. The eina_array is removing its item from pending_objects, while the evas_object_change that is calling evas_render_object_recalc is adding item to pending_objects. As a result, the pending_objects.count is incorrect, and it breaks render. Reviewers: Hermet, jsuya, herb Reviewed By: Hermet Subscribers: cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D11835
This commit is contained in:
parent
633202a0f9
commit
7b21b6fb97
|
@ -363,6 +363,7 @@ _evas_canvas_efl_object_constructor(Eo *eo_obj, Evas_Public_Data *e)
|
|||
EVAS_ARRAY_SET(e, glyph_unref_queue);
|
||||
EVAS_ARRAY_SET(e, texts_unref_queue);
|
||||
|
||||
eina_array_step_set(&e->render_post_change_objects, sizeof(e->render_post_change_objects), 10);
|
||||
eina_array_step_set(&e->map_clip_objects, sizeof(e->map_clip_objects), 64);
|
||||
|
||||
e->active_objects.version = EINA_ARRAY_VERSION;
|
||||
|
@ -648,6 +649,7 @@ _evas_canvas_efl_object_destructor(Eo *eo_e, Evas_Public_Data *e)
|
|||
eina_array_flush(&e->texts_unref_queue);
|
||||
eina_array_flush(&e->map_clip_objects);
|
||||
eina_hash_free(e->focused_objects);
|
||||
eina_array_flush(&e->render_post_change_objects);
|
||||
|
||||
SLKL(e->post_render.lock);
|
||||
EINA_INLIST_FREE(e->post_render.jobs, job)
|
||||
|
|
|
@ -3256,7 +3256,7 @@ evas_object_image_render_post(Evas_Object *eo_obj EINA_UNUSED,
|
|||
/* FIXME: copy strings across */
|
||||
|
||||
//Somehow(preloading cancelled) image has been changed, need to redraw.
|
||||
if (o->changed) evas_object_change(eo_obj, obj);
|
||||
if (o->changed) evas_render_post_change_object_push(obj);
|
||||
}
|
||||
|
||||
static void *
|
||||
|
|
|
@ -3761,6 +3761,14 @@ evas_render_updates_internal(Evas *eo_e,
|
|||
}
|
||||
eina_evlog("-render_post_reset", eo_e, 0.0, NULL);
|
||||
|
||||
for (i = 0; i < e->render_post_change_objects.count; ++i)
|
||||
{
|
||||
obj = eina_array_data_get(&e->render_post_change_objects, i);
|
||||
eo_obj = obj->object;
|
||||
evas_object_change(eo_obj, obj);
|
||||
}
|
||||
OBJS_ARRAY_CLEAN(&e->render_post_change_objects);
|
||||
|
||||
eina_evlog("+render_end", eo_e, 0.0, NULL);
|
||||
e->changed = EINA_FALSE;
|
||||
e->viewport.changed = EINA_FALSE;
|
||||
|
@ -4327,5 +4335,16 @@ evas_post_render_job_add(Evas_Public_Data *pd, void (*func)(void *), void *data)
|
|||
SLKU(pd->post_render.lock);
|
||||
}
|
||||
|
||||
void
|
||||
evas_render_post_change_object_push(Evas_Object_Protected_Data *obj)
|
||||
{
|
||||
Evas_Public_Data *e;
|
||||
|
||||
if (!obj || !obj->layer || !obj->layer->evas) return;
|
||||
|
||||
e = obj->layer->evas;
|
||||
OBJ_ARRAY_PUSH(&e->render_post_change_objects, obj);
|
||||
}
|
||||
|
||||
/* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/
|
||||
|
||||
|
|
|
@ -455,6 +455,7 @@ struct _Evas_Public_Data
|
|||
Eina_Array texts_unref_queue;
|
||||
Eina_Array map_clip_objects;
|
||||
Eina_List *finalize_objects;
|
||||
Eina_Array render_post_change_objects;
|
||||
|
||||
struct {
|
||||
Evas_Post_Render_Job *jobs;
|
||||
|
@ -1283,6 +1284,7 @@ void evas_unref_queue_image_put(Evas_Public_Data *pd, void *image);
|
|||
void evas_unref_queue_glyph_put(Evas_Public_Data *pd, void *glyph);
|
||||
void evas_unref_queue_texts_put(Evas_Public_Data *pd, void *glyph);
|
||||
void evas_post_render_job_add(Evas_Public_Data *pd, void (*func)(void *), void *data);
|
||||
void evas_render_post_change_object_push(Evas_Object_Protected_Data *obj);
|
||||
|
||||
void evas_draw_image_map_async_check(Evas_Object_Protected_Data *obj,
|
||||
void *engine, void *data, void *context, void *surface,
|
||||
|
|
Loading…
Reference in New Issue