diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c index 956e13dbcf..b6eab9f411 100644 --- a/src/lib/evas/canvas/evas_main.c +++ b/src/lib/evas/canvas/evas_main.c @@ -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) diff --git a/src/lib/evas/canvas/evas_object_image.c b/src/lib/evas/canvas/evas_object_image.c index cad6291286..958fabaf00 100644 --- a/src/lib/evas/canvas/evas_object_image.c +++ b/src/lib/evas/canvas/evas_object_image.c @@ -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 * diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index 1d47ba06af..139e292ad3 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -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 :*/ diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index 3a24821dd2..6d00cd7a21 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -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,