From 8ddfa35da67fe035805961f5c89312e61325586f Mon Sep 17 00:00:00 2001 From: Jean-Philippe Andre Date: Tue, 4 Mar 2014 15:17:11 +0900 Subject: [PATCH] Evas filters: Add return value in filter callback This will inform the client whether an asynchronous filter properly rendered or not. I actually don't know any case where rendering can fail at runtime. --- src/lib/evas/canvas/evas_object_text.c | 36 +++++++++++++++++++++++--- src/lib/evas/filters/evas_filter.c | 8 +++--- src/lib/evas/include/evas_filter.h | 2 +- 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/src/lib/evas/canvas/evas_object_text.c b/src/lib/evas/canvas/evas_object_text.c index d4a9561cad..308682524f 100644 --- a/src/lib/evas/canvas/evas_object_text.c +++ b/src/lib/evas/canvas/evas_object_text.c @@ -2024,9 +2024,37 @@ evas_font_draw_async_check(Evas_Object_Protected_Data *obj, } static void -evas_object_text_render(Evas_Object *eo_obj EINA_UNUSED, - Evas_Object_Protected_Data *obj, - void *type_private_data, +_filter_cb(Evas_Filter_Context *ctx, void *data, Eina_Bool success) +{ + Eo *eo_obj = data; + + // Destroy context as we won't reuse it. + evas_filter_context_destroy(ctx); + + // Redraw text with normal styles in case of failure + if (!success) + { + Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJ_CLASS); + Evas_Object_Text *o = (Evas_Object_Text *) obj->private_data; + + ERR("Filter failed at runtime!"); + o->cur.filter.invalid = EINA_TRUE; + + // Update object + _evas_object_text_items_clear(o); + o->changed = 1; + _evas_object_text_recalc(eo_obj, o->cur.text); + evas_object_change(eo_obj, obj); + evas_object_clip_dirty(eo_obj, obj); + evas_object_coords_recalc(eo_obj, obj); + evas_object_inform_call_resize(eo_obj); + } +} + +static void +evas_object_text_render(Evas_Object *eo_obj, + Evas_Object_Protected_Data *obj, + void *type_private_data, void *output, void *context, void *surface, int x, int y, Eina_Bool do_async) { @@ -2244,7 +2272,7 @@ evas_object_text_render(Evas_Object *eo_obj EINA_UNUSED, ENFN->context_free(ENDT, filter_ctx); // Add post-run callback and run filter - evas_filter_context_autodestroy(filter); + evas_filter_context_post_run_callback_set(filter, _filter_cb, eo_obj); ok = evas_filter_run(filter); o->cur.filter.changed = EINA_FALSE; diff --git a/src/lib/evas/filters/evas_filter.c b/src/lib/evas/filters/evas_filter.c index 816c30b041..8cb499140f 100644 --- a/src/lib/evas/filters/evas_filter.c +++ b/src/lib/evas/filters/evas_filter.c @@ -1719,10 +1719,10 @@ static void _filter_thread_run_cb(void *data) { Evas_Filter_Context *ctx = data; + Eina_Bool success; void *buffer; - // TODO: Add return value check and call error cb - _filter_chain_run(ctx); + success = _filter_chain_run(ctx); EINA_LIST_FREE(ctx->post_run.buffers_to_free, buffer) { @@ -1731,7 +1731,7 @@ _filter_thread_run_cb(void *data) } if (ctx->post_run.cb) - ctx->post_run.cb(ctx, ctx->post_run.data); + ctx->post_run.cb(ctx, ctx->post_run.data, success); } Eina_Bool @@ -1755,6 +1755,6 @@ evas_filter_run(Evas_Filter_Context *ctx) ret = _filter_chain_run(ctx); if (ctx->post_run.cb) - ctx->post_run.cb(ctx, ctx->post_run.data); + ctx->post_run.cb(ctx, ctx->post_run.data, ret); return ret; } diff --git a/src/lib/evas/include/evas_filter.h b/src/lib/evas/include/evas_filter.h index 2ad272c0f2..e79fc9e396 100644 --- a/src/lib/evas/include/evas_filter.h +++ b/src/lib/evas/include/evas_filter.h @@ -19,7 +19,7 @@ typedef enum _Evas_Filter_Fill_Mode Evas_Filter_Fill_Mode; typedef enum _Evas_Filter_Transform_Flags Evas_Filter_Transform_Flags; typedef Eina_Bool (* Evas_Filter_Apply_Func) (Evas_Filter_Command *cmd); -typedef void (* Evas_Filter_Cb) (Evas_Filter_Context *ctx, void *data); +typedef void (* Evas_Filter_Cb) (Evas_Filter_Context *ctx, void *data, Eina_Bool success); #define EVAS_FILTER_BUFFER_RGBA EINA_FALSE #define EVAS_FILTER_BUFFER_ALPHA EINA_TRUE