#undef EVAS_ARRAY_SET
eina_lock_new(&(e->lock_objects));
eina_spinlock_new(&(e->render.lock));
+ eina_spinlock_new(&(e->post_render.lock));
_evas_canvas_event_init(eo_obj, e);
{
Eina_Rectangle *r;
Evas_Coord_Touch_Point *touch_point;
+ Evas_Post_Render_Job *job;
Evas_Layer *lay;
Evas_Out *evo;
int i;
eina_array_flush(&e->texts_unref_queue);
eina_hash_free(e->focused_objects);
+ EINA_INLIST_FREE(e->post_render.jobs, job)
+ {
+ e->post_render.jobs = (Evas_Post_Render_Job *)
+ eina_inlist_remove(EINA_INLIST_GET(e->post_render.jobs), EINA_INLIST_GET(job));
+ free(job);
+ }
+
EINA_LIST_FREE(e->touch_points, touch_point)
free(touch_point);
eina_lock_free(&(e->lock_objects));
eina_spinlock_free(&(e->render.lock));
+ eina_spinlock_free(&(e->post_render.lock));
eina_hash_free(e->locks.masks);
eina_hash_free(e->modifiers.masks);
Render_Updates *ru;
Eina_Bool haveup = EINA_FALSE;
Eina_List *ret_updates = NULL;
+ Evas_Post_Render_Job *job;
Evas_Public_Data *evas;
+ Eina_Inlist *jobs_il;
evas = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
eina_array_foreach(&evas->texts_unref_queue, _drop_texts_ref, NULL);
eina_array_clean(&evas->texts_unref_queue);
+ SLKL(evas->post_render.lock);
+ jobs_il = EINA_INLIST_GET(evas->post_render.jobs);
+ evas->post_render.jobs = NULL;
+ SLKU(evas->post_render.lock);
+ EINA_INLIST_FREE(jobs_il, job)
+ {
+ jobs_il = eina_inlist_remove(jobs_il, EINA_INLIST_GET(job));
+ if (job->func)
+ job->func(job->data);
+ free(job);
+ }
+
/* post rendering */
_rendering_evases = eina_list_remove(_rendering_evases, evas);
evas->rendering = EINA_FALSE;
eina_array_push(&pd->texts_unref_queue, texts);
}
+void
+evas_post_render_job_add(Evas_Public_Data *pd, void (*func)(void *), void *data)
+{
+ Evas_Post_Render_Job *job;
+
+ if (!pd || pd->delete_me) return;
+ if (!func) return;
+
+ job = malloc(sizeof(*job));
+ job->func = func;
+ job->data = data;
+
+ SLKL(pd->post_render.lock);
+ pd->post_render.jobs = (Evas_Post_Render_Job *)
+ eina_inlist_append(EINA_INLIST_GET(pd->post_render.jobs), EINA_INLIST_GET(job));
+ SLKU(pd->post_render.lock);
+}
+
/* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/
unsigned char inside : 1;
};
+typedef struct _Evas_Post_Render_Job
+{
+ EINA_INLIST;
+ void (*func)(void *);
+ void *data;
+} Evas_Post_Render_Job;
+
struct _Evas_Public_Data
{
EINA_INLIST;
Eina_Array glyph_unref_queue;
Eina_Array texts_unref_queue;
+ struct {
+ Evas_Post_Render_Job *jobs;
+ Eina_Spinlock lock;
+ } post_render;
+
Eina_Clist calc_list;
Eina_Clist calc_done;
Eina_List *video_objects;
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_draw_image_map_async_check(Evas_Object_Protected_Data *obj,
void *data, void *context, void *surface,