jpeg pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=fe677a0518b6b60f016d51ed6ceb4a1cf3f820a0
commit fe677a0518b6b60f016d51ed6ceb4a1cf3f820a0 Author: Jean-Philippe Andre <[email protected]> Date: Thu Oct 23 15:27:40 2014 +0900 Evas: Use common function for proxy_subrender Merges functions from: - filters - image object --- src/lib/evas/canvas/evas_3d_texture.c | 2 + src/lib/evas/canvas/evas_object_image.c | 87 ++------------------------------- src/lib/evas/canvas/evas_render.c | 82 +++++++++++++++++++++++++++++++ src/lib/evas/filters/evas_filter.c | 87 +-------------------------------- src/lib/evas/include/evas_private.h | 2 + 5 files changed, 91 insertions(+), 169 deletions(-) diff --git a/src/lib/evas/canvas/evas_3d_texture.c b/src/lib/evas/canvas/evas_3d_texture.c index 9f46167..b87d143 100644 --- a/src/lib/evas/canvas/evas_3d_texture.c +++ b/src/lib/evas/canvas/evas_3d_texture.c @@ -66,6 +66,8 @@ _texture_proxy_subrender(Evas_3D_Texture *obj) if (!pd->source) return; + // TODO: replace this function by evas_render_proxy_subrender (as appropriate) + source = eo_data_scope_get(pd->source, EVAS_OBJECT_CLASS); is_image = eo_isa(pd->source, EVAS_IMAGE_CLASS); diff --git a/src/lib/evas/canvas/evas_object_image.c b/src/lib/evas/canvas/evas_object_image.c index 99e7b8b..03f422d 100644 --- a/src/lib/evas/canvas/evas_object_image.c +++ b/src/lib/evas/canvas/evas_object_image.c @@ -2272,85 +2272,6 @@ _proxy_error(Evas_Object *eo_proxy, void *context, void *output, void *surface, return; } - -/** - * Render the source object when a proxy is set. - * - * Used to force a draw if necessary, else just makes sure it's available. - */ -static void -_proxy_subrender(Evas *eo_e, Evas_Object *eo_source, Evas_Object *eo_proxy, Evas_Object_Protected_Data *proxy_obj, Eina_Bool do_async) -{ - Evas_Public_Data *e = eo_data_scope_get(eo_e, EVAS_CANVAS_CLASS); - Evas_Object_Protected_Data *source; - void *ctx; - int w, h; - - if (!eo_source) return; - source = eo_data_scope_get(eo_source, EVAS_OBJECT_CLASS); - - w = source->cur->geometry.w; - h = source->cur->geometry.h; - - EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, source->proxy, Evas_Object_Proxy_Data, proxy_write) - { - proxy_write->redraw = EINA_FALSE; - - /* We need to redraw surface then */ - if ((proxy_write->surface) && - ((proxy_write->w != w) || (proxy_write->h != h))) - { - e->engine.func->image_map_surface_free(e->engine.data.output, - proxy_write->surface); - proxy_write->surface = NULL; - } - - /* FIXME: Hardcoded alpha 'on' */ - /* FIXME (cont): Should see if the object has alpha */ - if (!proxy_write->surface) - { - proxy_write->surface = e->engine.func->image_map_surface_new - (e->engine.data.output, w, h, 1); - if (!proxy_write->surface) goto end; - proxy_write->w = w; - proxy_write->h = h; - } - - ctx = e->engine.func->context_new(e->engine.data.output); - e->engine.func->context_color_set(e->engine.data.output, ctx, 0, 0, - 0, 0); - e->engine.func->context_render_op_set(e->engine.data.output, ctx, - EVAS_RENDER_COPY); - e->engine.func->rectangle_draw(e->engine.data.output, ctx, - proxy_write->surface, 0, 0, w, h, - do_async); - e->engine.func->context_free(e->engine.data.output, ctx); - - ctx = e->engine.func->context_new(e->engine.data.output); - - Eina_Bool source_clip = EINA_FALSE; - eo_do(eo_proxy, source_clip = evas_obj_image_source_clip_get()); - - Evas_Proxy_Render_Data proxy_render_data = { - .eo_proxy = eo_proxy, - .proxy_obj = proxy_obj, - .eo_src = eo_source, - .source_clip = source_clip - }; - evas_render_mapped(e, eo_source, source, ctx, proxy_write->surface, - -source->cur->geometry.x, - -source->cur->geometry.y, - 1, 0, 0, e->output.w, e->output.h, - &proxy_render_data, 1, do_async); - - e->engine.func->context_free(e->engine.data.output, ctx); - proxy_write->surface = e->engine.func->image_dirty_region - (e->engine.data.output, proxy_write->surface, 0, 0, w, h); - } - end: - EINA_COW_WRITE_END(evas_object_proxy_cow, source->proxy, proxy_write); -} - static void _3d_set(Evas_Object *eo_obj, Evas_3D_Scene *scene) { @@ -3038,8 +2959,8 @@ evas_object_image_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, v else { o->proxyrendering = EINA_TRUE; - _proxy_subrender(obj->layer->evas->evas, o->cur->source, eo_obj, obj, - EINA_FALSE); + evas_render_proxy_subrender(obj->layer->evas->evas, o->cur->source, + eo_obj, obj, EINA_FALSE); pixels = source->proxy->surface; imagew = source->proxy->w; imageh = source->proxy->h; @@ -4109,8 +4030,8 @@ evas_object_image_is_inside(Evas_Object *eo_obj, else { o->proxyrendering = EINA_TRUE; - _proxy_subrender(obj->layer->evas->evas, o->cur->source, eo_obj, obj, - EINA_FALSE); + evas_render_proxy_subrender(obj->layer->evas->evas, o->cur->source, + eo_obj, obj, EINA_FALSE); pixels = source->proxy->surface; imagew = source->proxy->w; imageh = source->proxy->h; diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index f36b259..ea25d76 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -1473,6 +1473,88 @@ evas_render_mapped(Evas_Public_Data *e, Evas_Object *eo_obj, return clean_them; } +/* + * Render the source object when a proxy is set. + * Used to force a draw if necessary, else just makes sure it's available. + * Called from: image objects and text with filters. + * TODO: 3d objects subrender should probably be merged here as well. + */ +void +evas_render_proxy_subrender(Evas *eo_e, Evas_Object *eo_source, Evas_Object *eo_proxy, + Evas_Object_Protected_Data *proxy_obj, Eina_Bool do_async) +{ + Evas_Public_Data *e = eo_data_scope_get(eo_e, EVAS_CANVAS_CLASS); + Evas_Object_Protected_Data *source; + Eina_Bool source_clip = EINA_FALSE; + void *ctx; + int w, h; + + if (!eo_source) return; + source = eo_data_scope_get(eo_source, EVAS_OBJECT_CLASS); + + w = source->cur->geometry.w; + h = source->cur->geometry.h; + + EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, source->proxy, + Evas_Object_Proxy_Data, proxy_write) + { + proxy_write->redraw = EINA_FALSE; + + /* We need to redraw surface then */ + if ((proxy_write->surface) && + ((proxy_write->w != w) || (proxy_write->h != h))) + { + e->engine.func->image_map_surface_free(e->engine.data.output, + proxy_write->surface); + proxy_write->surface = NULL; + } + + /* FIXME: Hardcoded alpha 'on' */ + /* FIXME (cont): Should see if the object has alpha */ + if (!proxy_write->surface) + { + proxy_write->surface = e->engine.func->image_map_surface_new + (e->engine.data.output, w, h, 1); + if (!proxy_write->surface) goto end; + proxy_write->w = w; + proxy_write->h = h; + } + + ctx = e->engine.func->context_new(e->engine.data.output); + e->engine.func->context_color_set(e->engine.data.output, ctx, 0, 0, + 0, 0); + e->engine.func->context_render_op_set(e->engine.data.output, ctx, + EVAS_RENDER_COPY); + e->engine.func->rectangle_draw(e->engine.data.output, ctx, + proxy_write->surface, 0, 0, w, h, + do_async); + e->engine.func->context_free(e->engine.data.output, ctx); + + ctx = e->engine.func->context_new(e->engine.data.output); + + if (eo_isa(eo_proxy, EVAS_IMAGE_CLASS)) + eo_do(eo_proxy, source_clip = evas_obj_image_source_clip_get()); + + Evas_Proxy_Render_Data proxy_render_data = { + .eo_proxy = eo_proxy, + .proxy_obj = proxy_obj, + .eo_src = eo_source, + .source_clip = source_clip + }; + evas_render_mapped(e, eo_source, source, ctx, proxy_write->surface, + -source->cur->geometry.x, + -source->cur->geometry.y, + 1, 0, 0, e->output.w, e->output.h, + &proxy_render_data, 1, do_async); + + e->engine.func->context_free(e->engine.data.output, ctx); + proxy_write->surface = e->engine.func->image_dirty_region + (e->engine.data.output, proxy_write->surface, 0, 0, w, h); + } + end: + EINA_COW_WRITE_END(evas_object_proxy_cow, source->proxy, proxy_write); +} + static void _evas_render_cutout_add(Evas_Public_Data *e, Evas_Object_Protected_Data *obj, int off_x, int off_y) { diff --git a/src/lib/evas/filters/evas_filter.c b/src/lib/evas/filters/evas_filter.c index bad321f..3991f93 100644 --- a/src/lib/evas/filters/evas_filter.c +++ b/src/lib/evas/filters/evas_filter.c @@ -187,91 +187,6 @@ _filter_buffer_glimage_pixels_read(Evas_Filter_Buffer *fb) return ok; } - -/** - * @internal - * Render the source object when a proxy is set. - * - * Used to force a draw if necessary, else just makes sure it's available. - * @note This comes direcly from evas_object_image.c. - * A common function is desirable here :) - */ -static void -_proxy_subrender(Evas *eo_e, Evas_Object *eo_source, Evas_Object *eo_proxy, - Evas_Object_Protected_Data *proxy_obj, Eina_Bool do_async) -{ - Evas_Public_Data *e = eo_data_scope_get(eo_e, EVAS_CANVAS_CLASS); - Evas_Object_Protected_Data *source; - Eina_Bool source_clip = EINA_FALSE; - void *ctx; - int w, h; - - if (!eo_source) return; - source = eo_data_scope_get(eo_source, EVAS_OBJECT_CLASS); - - w = source->cur->geometry.w; - h = source->cur->geometry.h; - - EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, source->proxy, - Evas_Object_Proxy_Data, proxy_write) - { - proxy_write->redraw = EINA_FALSE; - - /* We need to redraw surface then */ - if ((proxy_write->surface) && - ((proxy_write->w != w) || (proxy_write->h != h))) - { - e->engine.func->image_map_surface_free(e->engine.data.output, - proxy_write->surface); - proxy_write->surface = NULL; - } - - /* FIXME: Hardcoded alpha 'on' */ - /* FIXME (cont): Should see if the object has alpha */ - if (!proxy_write->surface) - { - proxy_write->surface = e->engine.func->image_map_surface_new - (e->engine.data.output, w, h, 1); - if (!proxy_write->surface) goto end; - proxy_write->w = w; - proxy_write->h = h; - } - - ctx = e->engine.func->context_new(e->engine.data.output); - e->engine.func->context_color_set(e->engine.data.output, ctx, 0, 0, - 0, 0); - e->engine.func->context_render_op_set(e->engine.data.output, ctx, - EVAS_RENDER_COPY); - e->engine.func->rectangle_draw(e->engine.data.output, ctx, - proxy_write->surface, 0, 0, w, h, - do_async); - e->engine.func->context_free(e->engine.data.output, ctx); - - ctx = e->engine.func->context_new(e->engine.data.output); - - if (eo_isa(eo_proxy, EVAS_IMAGE_CLASS)) - eo_do(eo_proxy, source_clip = evas_obj_image_source_clip_get()); - - Evas_Proxy_Render_Data proxy_render_data = { - .eo_proxy = eo_proxy, - .proxy_obj = proxy_obj, - .eo_src = eo_source, - .source_clip = source_clip - }; - evas_render_mapped(e, eo_source, source, ctx, proxy_write->surface, - -source->cur->geometry.x, - -source->cur->geometry.y, - 1, 0, 0, e->output.w, e->output.h, - &proxy_render_data, 1, do_async); - - e->engine.func->context_free(e->engine.data.output, ctx); - proxy_write->surface = e->engine.func->image_dirty_region - (e->engine.data.output, proxy_write->surface, 0, 0, w, h); - } - end: - EINA_COW_WRITE_END(evas_object_proxy_cow, source->proxy, proxy_write); -} - /** @hidden private render proxy objects */ void evas_filter_context_proxy_render_all(Evas_Filter_Context *ctx, Eo *eo_obj, @@ -315,7 +230,7 @@ evas_filter_context_proxy_render_all(Evas_Filter_Context *ctx, Eo *eo_obj, DBG("Source needs to be rendered: '%s' of type '%s' (%s)", fb->source_name, eo_class_name_get(eo_class_get(fb->source)), source->proxy->redraw ? "redraw" : "no surface"); - _proxy_subrender(ctx->evas->evas, fb->source, eo_obj, obj, do_async); + evas_render_proxy_subrender(ctx->evas->evas, fb->source, eo_obj, obj, do_async); _filter_buffer_backing_free(fb); fb->w = source->cur->geometry.w; fb->h = source->cur->geometry.h; diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index 4bf389e..8f0c24e 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -1684,6 +1684,8 @@ Eina_Bool evas_render_mapped(Evas_Public_Data *e, Evas_Object *obj, int level, Eina_Bool do_async); void evas_render_invalidate(Evas *e); void evas_render_object_recalc(Evas_Object *obj); +void evas_render_proxy_subrender(Evas *eo_e, Evas_Object *eo_source, Evas_Object *eo_proxy, + Evas_Object_Protected_Data *proxy_obj, Eina_Bool do_async); Eina_Bool evas_map_inside_get(const Evas_Map *m, Evas_Coord x, Evas_Coord y); Eina_Bool evas_map_coords_get(const Evas_Map *m, Evas_Coord x, Evas_Coord y, Evas_Coord *mx, Evas_Coord *my, int grab); --
