cedric pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=55e1b3f2052535871dbdb0c2e22333066443bfe2
commit 55e1b3f2052535871dbdb0c2e22333066443bfe2 Author: Cedric BAIL <ced...@osg.samsung.com> Date: Mon Apr 24 15:09:25 2017 -0700 evas: remove engine.data.output. This is the first step toward handling multi output. This patch remove engine.data.output from Evas structure and use an Eina_List for it instead. It also start moving code around to fetch an output or an engine context (which are the same at the moment, but will be split in a later patch). --- src/lib/evas/canvas/efl_canvas_proxy.c | 2 +- src/lib/evas/canvas/efl_canvas_scene3d.c | 20 ++--- src/lib/evas/canvas/evas_canvas3d_scene.c | 2 +- src/lib/evas/canvas/evas_canvas3d_texture.c | 68 ++++++++--------- src/lib/evas/canvas/evas_clip.c | 2 +- src/lib/evas/canvas/evas_filter_mixin.c | 9 +-- src/lib/evas/canvas/evas_font_dir.c | 52 ++++++------- src/lib/evas/canvas/evas_gl.c | 40 +++++----- src/lib/evas/canvas/evas_image_private.h | 4 - src/lib/evas/canvas/evas_main.c | 89 +++++++++------------- src/lib/evas/canvas/evas_map.c | 10 +-- src/lib/evas/canvas/evas_object_image.c | 20 ++--- src/lib/evas/canvas/evas_object_main.c | 21 ++--- src/lib/evas/canvas/evas_object_polygon.c | 8 +- src/lib/evas/canvas/evas_object_text.c | 2 - src/lib/evas/canvas/evas_object_textblock.c | 6 +- src/lib/evas/canvas/evas_object_textgrid.c | 24 +++--- src/lib/evas/canvas/evas_object_vg.c | 4 +- src/lib/evas/canvas/evas_render.c | 58 +++++++++----- src/lib/evas/filters/evas_filter.c | 26 +++---- src/lib/evas/filters/evas_filter_private.h | 10 ++- src/lib/evas/include/evas_inline.x | 22 ++++++ src/lib/evas/include/evas_private.h | 20 ++--- .../evas/engines/gl_generic/evas_ector_gl_buffer.c | 17 +++-- .../gl_generic/evas_ector_gl_image_buffer.c | 15 ++-- src/modules/evas/engines/gl_generic/evas_engine.c | 2 +- .../evas/engines/software_generic/evas_engine.c | 2 +- .../software_generic/filters/evas_filter_blend.c | 2 +- 28 files changed, 289 insertions(+), 268 deletions(-) diff --git a/src/lib/evas/canvas/efl_canvas_proxy.c b/src/lib/evas/canvas/efl_canvas_proxy.c index 2e5af8d..c59e47c 100644 --- a/src/lib/evas/canvas/efl_canvas_proxy.c +++ b/src/lib/evas/canvas/efl_canvas_proxy.c @@ -173,7 +173,7 @@ _evas_image_proxy_unset(Evas_Object *proxy, Evas_Object_Protected_Data *cur_prox if (eina_list_count(proxy_source_write->proxies) == 0) { if (proxy_source_write->surface) - cur_proxy->layer->evas->engine.func->image_free(cur_proxy->layer->evas->engine.data.output, + cur_proxy->layer->evas->engine.func->image_free(_evas_engine_context(cur_proxy->layer->evas), proxy_source_write->surface); proxy_source_write->surface = NULL; proxy_source_write->redraw = EINA_FALSE; diff --git a/src/lib/evas/canvas/efl_canvas_scene3d.c b/src/lib/evas/canvas/efl_canvas_scene3d.c index 8c9ebae..5e97c8c 100644 --- a/src/lib/evas/canvas/efl_canvas_scene3d.c +++ b/src/lib/evas/canvas/efl_canvas_scene3d.c @@ -56,14 +56,14 @@ _evas_image_3d_render(Evas *eo_e, Evas_Object *eo_obj, if (e->engine.func->drawable_size_get) { - e->engine.func->drawable_size_get(e->engine.data.output, + e->engine.func->drawable_size_get(_evas_engine_context(e), pd_scene->surface, &w, &h); } if ((w != pd_scene->w) || (h != pd_scene->h)) { if (e->engine.func->drawable_free) { - e->engine.func->drawable_free(e->engine.data.output, + e->engine.func->drawable_free(_evas_engine_context(e), pd_scene->surface); } pd_scene->surface = NULL; @@ -76,8 +76,8 @@ _evas_image_3d_render(Evas *eo_e, Evas_Object *eo_obj, if (e->engine.func->drawable_new) { pd_scene->surface = - e->engine.func->drawable_new(e->engine.data.output, - pd_scene->w, pd_scene->h, 1); + e->engine.func->drawable_new(_evas_engine_context(e), + pd_scene->w, pd_scene->h, 1); } need_native_set = EINA_TRUE; } @@ -90,9 +90,9 @@ _evas_image_3d_render(Evas *eo_e, Evas_Object *eo_obj, if (e->engine.func->image_drawable_set) { data->surface = - e->engine.func->image_drawable_set(e->engine.data.output, - data->surface, - pd_scene->surface); + e->engine.func->image_drawable_set(_evas_engine_context(e), + data->surface, + pd_scene->surface); } } data->w = pd_scene->w; @@ -131,7 +131,7 @@ _evas_image_3d_render(Evas *eo_e, Evas_Object *eo_obj, /* Phase 5 - Draw the scene. */ if (e->engine.func->drawable_scene_render) { - e->engine.func->drawable_scene_render(e->engine.data.output, + e->engine.func->drawable_scene_render(_evas_engine_context(e), pd_scene->surface, &scene_data); } /* Clean up temporary resources. */ @@ -199,7 +199,7 @@ _evas_image_3d_unset(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Protected_Data e = obj->layer->evas; if (data->surface) - e->engine.func->image_free(e->engine.data.output, data->surface); + e->engine.func->image_free(_evas_engine_context(e), data->surface); data->surface = NULL; data->w = 0; @@ -251,7 +251,7 @@ _efl_canvas_scene3d_efl_gfx_buffer_buffer_map(Eo *eo_obj, void *_pd EINA_UNUSED, if (e->engine.func->drawable_size_get) { - e->engine.func->drawable_size_get(e->engine.data.output, + e->engine.func->drawable_size_get(_evas_engine_context(e), pd_scene->surface, &width, &height); } diff --git a/src/lib/evas/canvas/evas_canvas3d_scene.c b/src/lib/evas/canvas/evas_canvas3d_scene.c index 2ff3d07..2933fb3 100644 --- a/src/lib/evas/canvas/evas_canvas3d_scene.c +++ b/src/lib/evas/canvas/evas_canvas3d_scene.c @@ -669,7 +669,7 @@ _evas_canvas3d_scene_pick(const Eo *obj, Evas_Canvas3D_Scene_Data *pd, Evas_Real if (e->engine.func->drawable_scene_render_to_texture) { - if (e->engine.func->drawable_scene_render_to_texture(e->engine.data.output, + if (e->engine.func->drawable_scene_render_to_texture(_evas_engine_context(e), pd->surface, &scene_data)) { if (e->engine.func->drawable_texture_color_pick_id_get) diff --git a/src/lib/evas/canvas/evas_canvas3d_texture.c b/src/lib/evas/canvas/evas_canvas3d_texture.c index 1ad5e97..c1d54b7 100644 --- a/src/lib/evas/canvas/evas_canvas3d_texture.c +++ b/src/lib/evas/canvas/evas_canvas3d_texture.c @@ -31,7 +31,7 @@ _texture_proxy_unset(Evas_Canvas3D_Texture_Data *texture) proxy_src->surface != NULL) { Evas_Public_Data *e = src->layer->evas; - e->engine.func->image_free(e->engine.data.output, proxy_src->surface); + e->engine.func->image_free(_evas_engine_context(e), proxy_src->surface); proxy_src->surface = NULL; } @@ -78,7 +78,7 @@ _texture_proxy_subrender(Evas_Canvas3D_Texture *obj) if (is_image) { void *image = source->func->engine_data_get(pd->source); - e->engine.func->image_size_get(e->engine.data.output, image, &w, &h); + e->engine.func->image_size_get(_evas_engine_context(e), image, &w, &h); } else { @@ -90,7 +90,7 @@ _texture_proxy_subrender(Evas_Canvas3D_Texture *obj) if ((proxy_write->surface) && ((proxy_write->w != w) || (proxy_write->h != h))) { - e->engine.func->image_free(e->engine.data.output, proxy_write->surface); + e->engine.func->image_free(_evas_engine_context(e), proxy_write->surface); proxy_write->surface = NULL; } @@ -99,23 +99,23 @@ _texture_proxy_subrender(Evas_Canvas3D_Texture *obj) if (!proxy_write->surface) { proxy_write->surface = e->engine.func->image_map_surface_new - (e->engine.data.output, w, h, 1); + (_evas_engine_context(e), 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, + ctx = e->engine.func->context_new(_evas_default_output_get(e)); + e->engine.func->context_color_set(_evas_default_output_get(e), ctx, 0, 0, 0, 0); - e->engine.func->context_render_op_set(e->engine.data.output, ctx, + e->engine.func->context_render_op_set(_evas_default_output_get(e), ctx, EVAS_RENDER_COPY); - e->engine.func->rectangle_draw(e->engine.data.output, ctx, + e->engine.func->rectangle_draw(_evas_default_output_get(e), ctx, proxy_write->surface, 0, 0, w, h, EINA_FALSE); - e->engine.func->context_free(e->engine.data.output, ctx); + e->engine.func->context_free(_evas_default_output_get(e), ctx); - ctx = e->engine.func->context_new(e->engine.data.output); + ctx = e->engine.func->context_new(_evas_default_output_get(e)); if (is_image) { @@ -124,9 +124,9 @@ _texture_proxy_subrender(Evas_Canvas3D_Texture *obj) if (image) { int imagew, imageh; - e->engine.func->image_size_get(e->engine.data.output, image, + e->engine.func->image_size_get(_evas_engine_context(e), image, &imagew, &imageh); - e->engine.func->image_draw(e->engine.data.output, ctx, + e->engine.func->image_draw(_evas_default_output_get(e), ctx, proxy_write->surface, image, 0, 0, imagew, imageh, 0, 0, w, h, 0, EINA_FALSE); } @@ -148,9 +148,9 @@ _texture_proxy_subrender(Evas_Canvas3D_Texture *obj) &proxy_render_data, 1, EINA_FALSE); } - e->engine.func->context_free(e->engine.data.output, ctx); + e->engine.func->context_free(_evas_default_output_get(e), ctx); proxy_write->surface = e->engine.func->image_dirty_region - (e->engine.data.output, proxy_write->surface, 0, 0, w, h); + (_evas_default_output_get(e), proxy_write->surface, 0, 0, w, h); } end: EINA_COW_WRITE_END(evas_object_proxy_cow, source->proxy, proxy_write); @@ -172,7 +172,7 @@ _texture_fini(Evas_Canvas3D_Texture *obj) { Evas_Public_Data *e = efl_data_scope_get(evas, EVAS_CANVAS_CLASS); if (e->engine.func->texture_free) - e->engine.func->texture_free(e->engine.data.output, pd->engine_data); + e->engine.func->texture_free(_evas_engine_context(e), pd->engine_data); pd->engine_data = NULL; } @@ -233,7 +233,7 @@ _evas_canvas3d_texture_evas_canvas3d_object_update_notify(Eo *obj, Evas_Canvas3D if (e->engine.func->texture_new) { pd->engine_data = - e->engine.func->texture_new(e->engine.data.output, pd->atlas_enable); + e->engine.func->texture_new(_evas_engine_context(e), pd->atlas_enable); } if (pd->engine_data == NULL) @@ -247,7 +247,7 @@ _evas_canvas3d_texture_evas_canvas3d_object_update_notify(Eo *obj, Evas_Canvas3D { if (e->engine.func->texture_image_set) { - e->engine.func->texture_image_set(e->engine.data.output, + e->engine.func->texture_image_set(_evas_engine_context(e), pd->engine_data, src->proxy->surface); } @@ -259,7 +259,7 @@ _evas_canvas3d_texture_evas_canvas3d_object_update_notify(Eo *obj, Evas_Canvas3D _texture_proxy_subrender(obj); if (e->engine.func->texture_image_set) - e->engine.func->texture_image_set(e->engine.data.output, + e->engine.func->texture_image_set(_evas_engine_context(e), pd->engine_data, src->proxy->surface); pd->proxy_rendering = EINA_FALSE; @@ -347,14 +347,14 @@ _evas_canvas3d_texture_data_set(Eo *obj, Evas_Canvas3D_Texture_Data *pd, Evas_Public_Data *e = efl_data_scope_get(evas, EVAS_CANVAS_CLASS); if (!pd->engine_data && e->engine.func->texture_new) - pd->engine_data = e->engine.func->texture_new(e->engine.data.output, pd->atlas_enable); + pd->engine_data = e->engine.func->texture_new(_evas_engine_context(e), pd->atlas_enable); if (!data) { ERR("Failure, image data is empty"); return; } - image = e->engine.func->image_new_from_data(e->engine.data.output, w, h, (DATA32 *)data, EINA_TRUE, color_format); + image = e->engine.func->image_new_from_data(_evas_engine_context(e), w, h, (DATA32 *)data, EINA_TRUE, color_format); if (!image) { ERR("Can't load image from data"); @@ -362,10 +362,10 @@ _evas_canvas3d_texture_data_set(Eo *obj, Evas_Canvas3D_Texture_Data *pd, } if (e->engine.func->texture_image_set) - e->engine.func->texture_image_set(e->engine.data.output, + e->engine.func->texture_image_set(_evas_engine_context(e), pd->engine_data, image); - e->engine.func->image_free(e->engine.data.output, image); + e->engine.func->image_free(_evas_engine_context(e), image); evas_canvas3d_object_change(obj, EVAS_CANVAS3D_STATE_TEXTURE_DATA, NULL); } @@ -382,10 +382,10 @@ _evas_canvas3d_texture_file_set(Eo *obj, Evas_Canvas3D_Texture_Data *pd, const c Evas_Public_Data *e = efl_data_scope_get(evas, EVAS_CANVAS_CLASS); if (!pd->engine_data && e->engine.func->texture_new) - pd->engine_data = e->engine.func->texture_new(e->engine.data.output, pd->atlas_enable); + pd->engine_data = e->engine.func->texture_new(_evas_engine_context(e), pd->atlas_enable); memset(&lo, 0x0, sizeof(Evas_Image_Load_Opts)); - image = e->engine.func->image_load(e->engine.data.output, + image = e->engine.func->image_load(_evas_engine_context(e), file, key, &load_error, &lo); if (!image) { @@ -394,11 +394,11 @@ _evas_canvas3d_texture_file_set(Eo *obj, Evas_Canvas3D_Texture_Data *pd, const c } if (e->engine.func->texture_image_set) - e->engine.func->texture_image_set(e->engine.data.output, + e->engine.func->texture_image_set(_evas_engine_context(e), pd->engine_data, image); - e->engine.func->image_free(e->engine.data.output, image); + e->engine.func->image_free(_evas_engine_context(e), image); evas_canvas3d_object_change(obj, EVAS_CANVAS3D_STATE_TEXTURE_DATA, NULL); } @@ -438,7 +438,7 @@ _evas_canvas3d_texture_source_set(Eo *obj , Evas_Canvas3D_Texture_Data *pd, Evas return; } if (!pd->engine_data && e->engine.func->texture_new) - pd->engine_data = e->engine.func->texture_new(e->engine.data.output, pd->atlas_enable); + pd->engine_data = e->engine.func->texture_new(_evas_engine_context(e), pd->atlas_enable); _texture_proxy_set(obj, source, src); evas_canvas3d_object_change(obj, EVAS_CANVAS3D_STATE_TEXTURE_DATA, NULL); @@ -491,8 +491,8 @@ _evas_canvas3d_texture_color_format_get(const Eo *obj EINA_UNUSED, Evas_Canvas3D { void *image; - image = e->engine.func->texture_image_get(e->engine.data.output, pd->engine_data); - format = e->engine.func->image_colorspace_get(e->engine.data.output, image); + image = e->engine.func->texture_image_get(_evas_engine_context(e), pd->engine_data); + format = e->engine.func->image_colorspace_get(_evas_engine_context(e), image); } return format; @@ -506,7 +506,7 @@ _evas_canvas3d_texture_size_get(const Eo *obj, Evas_Canvas3D_Texture_Data *pd, i Evas_Public_Data *e = efl_data_scope_get(evas, EVAS_CANVAS_CLASS); if (e->engine.func->texture_size_get) { - e->engine.func->texture_size_get(e->engine.data.output, + e->engine.func->texture_size_get(_evas_engine_context(e), pd->engine_data, w, h); } } @@ -519,7 +519,7 @@ _evas_canvas3d_texture_wrap_set(Eo *obj, Evas_Canvas3D_Texture_Data *pd, Evas_Ca Evas_Public_Data *e = efl_data_scope_get(evas, EVAS_CANVAS_CLASS); if (e->engine.func->texture_wrap_set) { - e->engine.func->texture_wrap_set(e->engine.data.output, + e->engine.func->texture_wrap_set(_evas_engine_context(e), pd->engine_data, s, t); } evas_canvas3d_object_change(obj, EVAS_CANVAS3D_STATE_TEXTURE_WRAP, NULL); @@ -533,7 +533,7 @@ _evas_canvas3d_texture_wrap_get(Eo *obj, Evas_Canvas3D_Texture_Data *pd, Evas_Ca Evas_Public_Data *e = efl_data_scope_get(evas, EVAS_CANVAS_CLASS); if (e->engine.func->texture_wrap_set) { - e->engine.func->texture_wrap_get(e->engine.data.output, + e->engine.func->texture_wrap_get(_evas_engine_context(e), pd->engine_data, s, t); } } @@ -546,7 +546,7 @@ _evas_canvas3d_texture_filter_set(Eo *obj, Evas_Canvas3D_Texture_Data *pd, Evas_ Evas_Public_Data *e = efl_data_scope_get(evas, EVAS_CANVAS_CLASS); if (e->engine.func->texture_filter_set) { - e->engine.func->texture_filter_set(e->engine.data.output, + e->engine.func->texture_filter_set(_evas_engine_context(e), pd->engine_data, min, mag); } evas_canvas3d_object_change(obj, EVAS_CANVAS3D_STATE_TEXTURE_FILTER, NULL); @@ -560,7 +560,7 @@ _evas_canvas3d_texture_filter_get(const Eo *obj EINA_UNUSED, Evas_Canvas3D_Textu Evas_Public_Data *e = efl_data_scope_get(evas, EVAS_CANVAS_CLASS); if (e->engine.func->texture_filter_get) { - e->engine.func->texture_filter_get(e->engine.data.output, + e->engine.func->texture_filter_get(_evas_engine_context(e), pd->engine_data, min, mag); } } diff --git a/src/lib/evas/canvas/evas_clip.c b/src/lib/evas/canvas/evas_clip.c index 3b11044..38c468b 100644 --- a/src/lib/evas/canvas/evas_clip.c +++ b/src/lib/evas/canvas/evas_clip.c @@ -203,7 +203,7 @@ _efl_canvas_object_clip_mask_unset(Evas_Object_Protected_Data *obj) mask->is_alpha = EINA_FALSE; if (mask->surface) { - obj->layer->evas->engine.func->image_free(obj->layer->evas->engine.data.output, mask->surface); + obj->layer->evas->engine.func->image_free(ENC, mask->surface); mask->surface = NULL; } mask->w = 0; diff --git a/src/lib/evas/canvas/evas_filter_mixin.c b/src/lib/evas/canvas/evas_filter_mixin.c index 1c5dd60..66eb496 100644 --- a/src/lib/evas/canvas/evas_filter_mixin.c +++ b/src/lib/evas/canvas/evas_filter_mixin.c @@ -8,9 +8,6 @@ #define MY_CLASS EFL_CANVAS_FILTER_INTERNAL_MIXIN -#define ENFN obj->layer->evas->engine.func -#define ENDT obj->layer->evas->engine.data.output - #define FCOW_BEGIN(_pd) ({ Evas_Object_Filter_Data *_fcow = eina_cow_write(evas_object_filter_cow, (const Eina_Cow_Data**)&(_pd->data)); _state_check(_fcow); _fcow; }) #define FCOW_END(_fcow, _pd) eina_cow_done(evas_object_filter_cow, (const Eina_Cow_Data**)&(_pd->data), _fcow, EINA_TRUE) #define FCOW_WRITE(pd, name, value) do { \ @@ -121,7 +118,7 @@ _filter_end_sync(Evas_Filter_Context *ctx, Evas_Object_Protected_Data *obj, } if (previous) - ENFN->image_free(ENDT, previous); + ENFN->image_free(ENC, previous); if (destroy) { @@ -285,7 +282,7 @@ evas_filter_object_render(Eo *eo_obj, Evas_Object_Protected_Data *obj, int iw, ih; use_map = EINA_TRUE; - ENFN->image_size_get(ENDT, previous, &iw, &ih); + ENFN->image_size_get(ENC, previous, &iw, &ih); evas_object_map_update(eo_obj, x, y, iw, ih, iw, ih); } @@ -728,7 +725,7 @@ _efl_canvas_filter_internal_efl_object_destructor(Eo *eo_obj, Evas_Filter_Data * if (pd->data->output) { if (!pd->data->async) - ENFN->image_free(ENDT, pd->data->output); + ENFN->image_free(ENC, pd->data->output); else evas_unref_queue_image_put(e, pd->data->output); } diff --git a/src/lib/evas/canvas/evas_font_dir.c b/src/lib/evas/canvas/evas_font_dir.c index 682f80f..1b7041c 100644 --- a/src/lib/evas/canvas/evas_font_dir.c +++ b/src/lib/evas/canvas/evas_font_dir.c @@ -146,7 +146,7 @@ evas_fonts_zero_free(Evas *eo_evas) if (fd->fdesc) evas_font_desc_unref(fd->fdesc); if (fd->source) eina_stringshare_del(fd->source); if ((evas->engine.func) && (evas->engine.func->font_free)) - evas->engine.func->font_free(evas->engine.data.output, fd->font); + evas->engine.func->font_free(_evas_engine_context(evas), fd->font); #ifdef HAVE_FONTCONFIG if (fd->set) FcFontSetDestroy(fd->set); if (fd->p_nm) FcPatternDestroy(fd->p_nm); @@ -172,7 +172,7 @@ evas_fonts_zero_pressure(Evas *eo_evas) if (fd->fdesc) evas_font_desc_unref(fd->fdesc); if (fd->source) eina_stringshare_del(fd->source); if ((evas->engine.func) && (evas->engine.func->font_free)) - evas->engine.func->font_free(evas->engine.data.output, fd->font); + evas->engine.func->font_free(_evas_engine_context(evas), fd->font); #ifdef HAVE_FONTCONFIG if (fd->set) FcFontSetDestroy(fd->set); if (fd->p_nm) FcPatternDestroy(fd->p_nm); @@ -213,7 +213,7 @@ evas_font_free(Evas *eo_evas, void *font) if (fd->fdesc) evas_font_desc_unref(fd->fdesc); if (fd->source) eina_stringshare_del(fd->source); - evas->engine.func->font_free(evas->engine.data.output, fd->font); + evas->engine.func->font_free(_evas_engine_context(evas), fd->font); #ifdef HAVE_FONTCONFIG if (fd->set) FcFontSetDestroy(fd->set); if (fd->p_nm) FcPatternDestroy(fd->p_nm); @@ -240,9 +240,9 @@ _evas_load_fontconfig(Evas_Font_Set *font, Evas *eo_evas, FcFontSet *set, int si FcPatternGet(set->fonts[i], FC_FILE, 0, &filename); if (font) - evas->engine.func->font_add(evas->engine.data.output, font, (char *)filename.u.s, size, wanted_rend); + evas->engine.func->font_add(_evas_engine_context(evas), font, (char *)filename.u.s, size, wanted_rend); else - font = evas->engine.func->font_load(evas->engine.data.output, (char *)filename.u.s, size, wanted_rend); + font = evas->engine.func->font_load(_evas_engine_context(evas), (char *)filename.u.s, size, wanted_rend); } return font; @@ -648,7 +648,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, fake_name = evas_file_path_join(source, nm); if (fake_name) { - font = evas->engine.func->font_load(evas->engine.data.output, fake_name, size, wanted_rend); + font = evas->engine.func->font_load(_evas_engine_context(evas), fake_name, size, wanted_rend); if (!font) /* Load from fake name failed, probably not cached */ { /* read original!!! */ @@ -661,7 +661,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, fdata = eet_read(ef, nm, &fsize); if (fdata) { - font = evas->engine.func->font_memory_load(evas->engine.data.output, source, nm, size, fdata, fsize, wanted_rend); + font = evas->engine.func->font_memory_load(_evas_engine_context(evas), source, nm, size, fdata, fsize, wanted_rend); free(fdata); } eet_close(ef); @@ -673,7 +673,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, if (!font) /* Source load failed */ { if (evas_file_path_is_full_path((char *)nm)) /* Try filename */ - font = evas->engine.func->font_load(evas->engine.data.output, (char *)nm, size, wanted_rend); + font = evas->engine.func->font_load(_evas_engine_context(evas), (char *)nm, size, wanted_rend); else /* search font path */ { Eina_List *ll; @@ -686,7 +686,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, f_file = evas_font_dir_cache_find(dir, (char *)nm); if (f_file) { - font = evas->engine.func->font_load(evas->engine.data.output, f_file, size, wanted_rend); + font = evas->engine.func->font_load(_evas_engine_context(evas), f_file, size, wanted_rend); if (font) break; } } @@ -700,7 +700,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, f_file = evas_font_dir_cache_find(dir, (char *)nm); if (f_file) { - font = evas->engine.func->font_load(evas->engine.data.output, f_file, size, wanted_rend); + font = evas->engine.func->font_load(_evas_engine_context(evas), f_file, size, wanted_rend); if (font) break; } } @@ -721,7 +721,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, if (fake_name) { /* FIXME: make an engine func */ - if (!evas->engine.func->font_add(evas->engine.data.output, font, fake_name, size, wanted_rend)) + if (!evas->engine.func->font_add(_evas_engine_context(evas), font, fake_name, size, wanted_rend)) { /* read original!!! */ ef = eet_open(source, EET_FILE_MODE_READ); @@ -733,7 +733,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, fdata = eet_read(ef, nm, &fsize); if ((fdata) && (fsize > 0)) { - ok = evas->engine.func->font_memory_add(evas->engine.data.output, font, source, nm, size, fdata, fsize, wanted_rend); + ok = evas->engine.func->font_memory_add(_evas_engine_context(evas), font, source, nm, size, fdata, fsize, wanted_rend); } eet_close(ef); free(fdata); @@ -747,7 +747,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, if (!ok) { if (evas_file_path_is_full_path((char *)nm)) - evas->engine.func->font_add(evas->engine.data.output, font, (char *)nm, size, wanted_rend); + evas->engine.func->font_add(_evas_engine_context(evas), font, (char *)nm, size, wanted_rend); else { Eina_List *ll; @@ -761,7 +761,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, f_file = evas_font_dir_cache_find(dir, (char *)nm); if (f_file) { - fn = (RGBA_Font *)evas->engine.func->font_add(evas->engine.data.output, font, f_file, size, wanted_rend); + fn = (RGBA_Font *)evas->engine.func->font_add(_evas_engine_context(evas), font, f_file, size, wanted_rend); if (fn) break; } @@ -776,7 +776,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, f_file = evas_font_dir_cache_find(dir, (char *)nm); if (f_file) { - fn = (RGBA_Font *)evas->engine.func->font_add(evas->engine.data.output, font, f_file, size, wanted_rend); + fn = (RGBA_Font *)evas->engine.func->font_add(_evas_engine_context(evas), font, f_file, size, wanted_rend); if (fn) break; } @@ -901,7 +901,7 @@ evas_font_load(Evas *eo_evas, Evas_Font_Description *fdesc, const char *source, } if (font) - evas->engine.func->font_hinting_set(evas->engine.data.output, font, + evas->engine.func->font_hinting_set(_evas_engine_context(evas), font, evas->hinting); return font; } @@ -910,7 +910,7 @@ void evas_font_load_hinting_set(Evas *eo_evas, void *font, int hinting) { Evas_Public_Data *evas = efl_data_scope_get(eo_evas, EVAS_CANVAS_CLASS); - evas->engine.func->font_hinting_set(evas->engine.data.output, font, + evas->engine.func->font_hinting_set(_evas_engine_context(evas), font, hinting); } @@ -1472,9 +1472,9 @@ _evas_canvas_font_hinting_get(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e) EOLIAN Eina_Bool _evas_canvas_font_hinting_can_hint(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, Evas_Font_Hinting_Flags hinting) { - if (e->engine.func->font_hinting_can_hint && e->engine.data.output) - return e->engine.func->font_hinting_can_hint(e->engine.data.output, - hinting); + if (e->engine.func->font_hinting_can_hint && _evas_engine_context(e)) + return e->engine.func->font_hinting_can_hint(_evas_engine_context(e), + hinting); else return EINA_FALSE; } @@ -1483,8 +1483,8 @@ _evas_canvas_font_cache_flush(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e) { evas_canvas_async_block(e); evas_render_rendering_wait(e); - if (e->engine.data.output) - e->engine.func->font_cache_flush(e->engine.data.output); + if (_evas_engine_context(e)) + e->engine.func->font_cache_flush(_evas_engine_context(e)); } EOLIAN void @@ -1493,15 +1493,15 @@ _evas_canvas_font_cache_set(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, int size) if (size < 0) size = 0; evas_canvas_async_block(e); evas_render_rendering_wait(e); - if (e->engine.data.output) - e->engine.func->font_cache_set(e->engine.data.output, size); + if (_evas_engine_context(e)) + e->engine.func->font_cache_set(_evas_engine_context(e), size); } EOLIAN int _evas_canvas_font_cache_get(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e) { - if (e->engine.data.output) - return e->engine.func->font_cache_get(e->engine.data.output); + if (_evas_engine_context(e)) + return e->engine.func->font_cache_get(_evas_engine_context(e)); return -1; } diff --git a/src/lib/evas/canvas/evas_gl.c b/src/lib/evas/canvas/evas_gl.c index 0f4760c..18c438b 100644 --- a/src/lib/evas/canvas/evas_gl.c +++ b/src/lib/evas/canvas/evas_gl.c @@ -244,7 +244,7 @@ evas_gl_surface_create(Evas_GL *evas_gl, Evas_GL_Config *config, int width, int return NULL; } - surf->data = evas_gl->evas->engine.func->gl_surface_create(evas_gl->evas->engine.data.output, config, width, height); + surf->data = evas_gl->evas->engine.func->gl_surface_create(_evas_engine_context(evas_gl->evas), config, width, height); if (!surf->data) { @@ -301,7 +301,7 @@ evas_gl_pbuffer_surface_create(Evas_GL *evas_gl, Evas_GL_Config *cfg, } surf->data = evas_gl->evas->engine.func->gl_pbuffer_surface_create - (evas_gl->evas->engine.data.output, cfg, w, h, attrib_list); + (_evas_engine_context(evas_gl->evas), cfg, w, h, attrib_list); if (!surf->data) { ERR("Engine failed to create a PBuffer!"); @@ -333,7 +333,7 @@ evas_gl_surface_destroy(Evas_GL *evas_gl, Evas_GL_Surface *surf) } // Call Engine's Surface Destroy - evas_gl->evas->engine.func->gl_surface_destroy(evas_gl->evas->engine.data.output, surf->data); + evas_gl->evas->engine.func->gl_surface_destroy(_evas_engine_context(evas_gl->evas), surf->data); // Remove it from the list LKL(evas_gl->lck); @@ -362,7 +362,7 @@ evas_gl_engine_data_get(void *evgl) if (!evasgl) return NULL; if (!evasgl->evas) return NULL; - return evasgl->evas->engine.data.output; + return _evas_engine_context(evasgl->evas); } EAPI Evas_GL_Context * @@ -396,8 +396,8 @@ evas_gl_context_version_create(Evas_GL *evas_gl, Evas_GL_Context *share_ctx, // Call engine->gl_create_context ctx->version = version; ctx->data = evas_gl->evas->engine.func->gl_context_create - (evas_gl->evas->engine.data.output, share_ctx ? share_ctx->data : NULL, - version, &evas_gl_native_context_get, &evas_gl_engine_data_get); + (_evas_engine_context(evas_gl->evas), share_ctx ? share_ctx->data : NULL, + version, &evas_gl_native_context_get, &evas_gl_engine_data_get); // Set a few variables if (!ctx->data) @@ -437,7 +437,7 @@ evas_gl_context_destroy(Evas_GL *evas_gl, Evas_GL_Context *ctx) } // Call Engine's destroy - evas_gl->evas->engine.func->gl_context_destroy(evas_gl->evas->engine.data.output, ctx->data); + evas_gl->evas->engine.func->gl_context_destroy(_evas_engine_context(evas_gl->evas), ctx->data); // Remove it from the list LKL(evas_gl->lck); @@ -459,11 +459,11 @@ evas_gl_make_current(Evas_GL *evas_gl, Evas_GL_Surface *surf, Evas_GL_Context *c MAGIC_CHECK_END(); if ((surf) && (ctx)) - ret = (Eina_Bool)evas_gl->evas->engine.func->gl_make_current(evas_gl->evas->engine.data.output, surf->data, ctx->data); + ret = (Eina_Bool)evas_gl->evas->engine.func->gl_make_current(_evas_engine_context(evas_gl->evas), surf->data, ctx->data); else if ((!surf) && (!ctx)) - ret = (Eina_Bool)evas_gl->evas->engine.func->gl_make_current(evas_gl->evas->engine.data.output, NULL, NULL); + ret = (Eina_Bool)evas_gl->evas->engine.func->gl_make_current(_evas_engine_context(evas_gl->evas), NULL, NULL); else if ((!surf) && (ctx)) // surfaceless make current - ret = (Eina_Bool)evas_gl->evas->engine.func->gl_make_current(evas_gl->evas->engine.data.output, NULL, ctx->data); + ret = (Eina_Bool)evas_gl->evas->engine.func->gl_make_current(_evas_engine_context(evas_gl->evas), NULL, ctx->data); else { ERR("Bad match between surface: %p and context: %p", surf, ctx); @@ -496,7 +496,7 @@ evas_gl_current_context_get(Evas_GL *evas_gl) return NULL; } - internal_ctx = evas_gl->evas->engine.func->gl_current_context_get(evas_gl->evas->engine.data.output); + internal_ctx = evas_gl->evas->engine.func->gl_current_context_get(_evas_engine_context(evas_gl->evas)); if (!internal_ctx) return NULL; @@ -534,7 +534,7 @@ evas_gl_current_surface_get(Evas_GL *evas_gl) return NULL; } - internal_sfc = evas_gl->evas->engine.func->gl_current_surface_get(evas_gl->evas->engine.data.output); + internal_sfc = evas_gl->evas->engine.func->gl_current_surface_get(_evas_engine_context(evas_gl->evas)); if (!internal_sfc) return NULL; @@ -580,7 +580,7 @@ evas_gl_string_query(Evas_GL *evas_gl, int name) return ""; MAGIC_CHECK_END(); - return evas_gl->evas->engine.func->gl_string_query(evas_gl->evas->engine.data.output, name); + return evas_gl->evas->engine.func->gl_string_query(_evas_engine_context(evas_gl->evas), name); } EAPI Evas_GL_Func @@ -590,7 +590,7 @@ evas_gl_proc_address_get(Evas_GL *evas_gl, const char *name) return NULL; MAGIC_CHECK_END(); - return (Evas_GL_Func)evas_gl->evas->engine.func->gl_proc_address_get(evas_gl->evas->engine.data.output, name); + return (Evas_GL_Func)evas_gl->evas->engine.func->gl_proc_address_get(_evas_engine_context(evas_gl->evas), name); } EAPI Eina_Bool @@ -614,7 +614,7 @@ evas_gl_native_surface_get(Evas_GL *evas_gl, Evas_GL_Surface *surf, Evas_Native_ return EINA_FALSE; } - return (Eina_Bool)evas_gl->evas->engine.func->gl_native_surface_get(evas_gl->evas->engine.data.output, surf->data, ns); + return (Eina_Bool)evas_gl->evas->engine.func->gl_native_surface_get(_evas_engine_context(evas_gl->evas), surf->data, ns); } @@ -625,7 +625,7 @@ evas_gl_api_get(Evas_GL *evas_gl) return NULL; MAGIC_CHECK_END(); - return (Evas_GL_API*)evas_gl->evas->engine.func->gl_api_get(evas_gl->evas->engine.data.output, EVAS_GL_GLES_2_X); + return (Evas_GL_API*)evas_gl->evas->engine.func->gl_api_get(_evas_engine_context(evas_gl->evas), EVAS_GL_GLES_2_X); } EAPI Evas_GL_API * @@ -641,7 +641,7 @@ evas_gl_context_api_get(Evas_GL *evas_gl, Evas_GL_Context *ctx) return NULL; } - return (Evas_GL_API*)evas_gl->evas->engine.func->gl_api_get(evas_gl->evas->engine.data.output, ctx->version); + return (Evas_GL_API*)evas_gl->evas->engine.func->gl_api_get(_evas_engine_context(evas_gl->evas), ctx->version); } EAPI int @@ -654,7 +654,7 @@ evas_gl_rotation_get(Evas_GL *evas_gl) if (!evas_gl->evas->engine.func->gl_rotation_angle_get) return 0; - return evas_gl->evas->engine.func->gl_rotation_angle_get(evas_gl->evas->engine.data.output); + return evas_gl->evas->engine.func->gl_rotation_angle_get(_evas_engine_context(evas_gl->evas)); } EAPI int @@ -672,7 +672,7 @@ evas_gl_error_get(Evas_GL *evas_gl) if (!evas_gl->evas->engine.func->gl_error_get) err = EVAS_GL_NOT_INITIALIZED; else - err = evas_gl->evas->engine.func->gl_error_get(evas_gl->evas->engine.data.output); + err = evas_gl->evas->engine.func->gl_error_get(_evas_engine_context(evas_gl->evas)); end: /* Call to evas_gl_error_get() should set error to EVAS_GL_SUCCESS */ @@ -703,5 +703,5 @@ evas_gl_surface_query(Evas_GL *evas_gl, Evas_GL_Surface *surface, int attribute, } return evas_gl->evas->engine.func->gl_surface_query - (evas_gl->evas->engine.data.output, surface->data, attribute, value); + (_evas_engine_context(evas_gl->evas), surface->data, attribute, value); } diff --git a/src/lib/evas/canvas/evas_image_private.h b/src/lib/evas/canvas/evas_image_private.h index 48e6e8b..77b837d 100644 --- a/src/lib/evas/canvas/evas_image_private.h +++ b/src/lib/evas/canvas/evas_image_private.h @@ -213,10 +213,6 @@ void *_evas_image_data_convert_internal(Evas_Image_Data *o, void *data, Evas_Col void _evas_image_unload(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, Eina_Bool dirty); void _evas_image_load(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, Evas_Image_Data *o); -/* save typing */ -#define ENFN obj->layer->evas->engine.func -#define ENDT obj->layer->evas->engine.data.output - # define EINA_COW_IMAGE_STATE_WRITE_BEGIN(Obj, Write) \ EINA_COW_WRITE_BEGIN(evas_object_image_state_cow, Obj->cur, Evas_Object_Image_State, Write) diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c index 1323a89..6af60da 100644 --- a/src/lib/evas/canvas/evas_main.c +++ b/src/lib/evas/canvas/evas_main.c @@ -350,13 +350,6 @@ _evas_canvas_efl_object_destructor(Eo *eo_e, Evas_Public_Data *e) EINA_LIST_FREE(e->outputs, evo) efl_canvas_output_del(evo); - if (e->engine.func) - { - e->engine.func->ector_destroy(e->engine.data.output, - e->engine.ector); - e->engine.func->output_free(e->engine.data.output); - e->engine.func->info_free(eo_e, e->engine.info); - } if (e->common_init) { e->common_init = 0; @@ -419,58 +412,35 @@ _evas_canvas_efl_object_destructor(Eo *eo_e, Evas_Public_Data *e) efl_destructor(efl_super(eo_e, MY_CLASS)); } +// It is now expected that the first output in the list is the default one +// manipulated by this set of legacy API + EAPI Evas_Engine_Info * evas_engine_info_get(const Evas *obj) { const Evas_Public_Data *e = efl_data_scope_get(obj, EVAS_CANVAS_CLASS); - Evas_Engine_Info *info; - - if (!e->engine.info) return NULL; + Efl_Canvas_Output *output; - info = e->engine.info; - ((Evas_Public_Data *)e)->engine.info_magic = info->magic; + output = eina_list_data_get(e->outputs); + if (!output) + { + output = efl_canvas_output_add((Evas*) obj); + } + if (!output) return NULL; - return info; + return efl_canvas_output_engine_info_get(output); } EAPI Eina_Bool evas_engine_info_set(Evas *obj, Evas_Engine_Info *info) { Evas_Public_Data *e = efl_data_scope_get(obj, EVAS_CANVAS_CLASS); + Efl_Canvas_Output *output; + output = eina_list_data_get(e->outputs); + if (!output) return EINA_FALSE; if (!info) return EINA_FALSE; - if (info != e->engine.info) return EINA_FALSE; - if (info->magic != e->engine.info_magic) return EINA_FALSE; - - evas_canvas_async_block(e); - - if (e->engine.data.output) - { - if (e->engine.func->update) - { - e->engine.func->update(e->engine.data.output, info, e->output.w, e->output.h); - } - else - { - // For engine who do not provide an update function - e->engine.func->output_free(e->engine.data.output); - - goto setup; - } - } - else - { - if (!e->common_init) - { - e->common_init = 1; - evas_common_init(); - } - - setup: - e->engine.data.output = e->engine.func->setup(info, e->output.w, e->output.h); - } - - return !!e->engine.data.output; + return efl_canvas_output_engine_info_set(output, info); } EOLIAN static Evas_Coord @@ -831,11 +801,19 @@ _evas_canvas_efl_loop_user_loop_get(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e EI } Ector_Surface * -evas_ector_get(Evas_Public_Data *e) +evas_ector_get(Evas_Public_Data *e, void *output) { - if (!e->engine.ector) - e->engine.ector = e->engine.func->ector_create(e->engine.data.output); - return e->engine.ector; + Efl_Canvas_Output *r; + Eina_List *l; + + EINA_LIST_FOREACH(e->outputs, l, r) + if (r->output == output) + { + if (!r->ector) + r->ector = e->engine.func->ector_create(_evas_engine_context(e), output); + return r->ector; + } + return NULL; } EAPI void @@ -868,11 +846,11 @@ _image_data_unset(Evas_Object_Protected_Data *obj, Eina_List **list) obj->layer->evas->engine.func->ector_free(data->engine_data)) else CHECK(EFL_CANVAS_POLYGON_CLASS, Efl_Canvas_Polygon_Data, data->engine_data = - obj->layer->evas->engine.func->polygon_points_clear(obj->layer->evas->engine.data.output, + obj->layer->evas->engine.func->polygon_points_clear(ENC, data->engine_data)) else CHECK(EVAS_CANVAS3D_TEXTURE_CLASS, Evas_Canvas3D_Texture_Data, if (obj->layer->evas->engine.func->texture_free) - obj->layer->evas->engine.func->texture_free(obj->layer->evas->engine.data.output, data->engine_data)) + obj->layer->evas->engine.func->texture_free(ENC, data->engine_data)) else return; #undef CHECK evas_object_ref(obj->object); @@ -1015,7 +993,14 @@ evas_output_method_set(Evas *eo_e, int render_method) e->engine.module = em; evas_module_ref(em); /* get the engine info struct */ - if (e->engine.func->info) e->engine.info = e->engine.func->info(eo_e); + if (e->engine.func->info) + { + Efl_Canvas_Output *output; + Eina_List *l; + + EINA_LIST_FOREACH(e->outputs, l, output) + output->info = e->engine.func->info(eo_e); + } // Wayland already handles seats. if (em->definition && (eina_streq(em->definition->name, "wayland_shm") || diff --git a/src/lib/evas/canvas/evas_map.c b/src/lib/evas/canvas/evas_map.c index 7f8e794..4160452 100644 --- a/src/lib/evas/canvas/evas_map.c +++ b/src/lib/evas/canvas/evas_map.c @@ -205,7 +205,7 @@ _evas_map_free(Evas_Object *eo_obj, Evas_Map *m) Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); if ((obj) && (obj->map->spans)) { - obj->layer->evas->engine.func->image_map_clean(obj->layer->evas->engine.data.output, obj->map->spans); + obj->layer->evas->engine.func->image_map_clean(ENC, obj->map->spans); EINA_COW_WRITE_BEGIN(evas_object_map_cow, obj->map, Evas_Object_Map_Data, map_write) { free(map_write->spans); @@ -490,9 +490,7 @@ _map_map_enable_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, { EINA_COW_WRITE_BEGIN(evas_object_map_cow, obj->map, Evas_Object_Map_Data, map_write) { - obj->layer->evas->engine.func->image_free - (obj->layer->evas->engine.data.output, - map_write->surface); + obj->layer->evas->engine.func->image_free(ENC, map_write->surface); map_write->surface = NULL; } EINA_COW_WRITE_END(evas_object_map_cow, obj->map, map_write); @@ -581,9 +579,7 @@ evas_object_map_set(Evas_Object *eo_obj, const Evas_Map *map) { EINA_COW_WRITE_BEGIN(evas_object_map_cow, obj->map, Evas_Object_Map_Data, map_write) { - obj->layer->evas->engine.func->image_free - (obj->layer->evas->engine.data.output, - map_write->surface); + obj->layer->evas->engine.func->image_free(ENC, map_write->surface); map_write->surface = NULL; } EINA_COW_WRITE_END(evas_object_map_cow, obj->map, map_write); diff --git a/src/lib/evas/canvas/evas_object_image.c b/src/lib/evas/canvas/evas_object_image.c index 0dcb779..0065740 100644 --- a/src/lib/evas/canvas/evas_object_image.c +++ b/src/lib/evas/canvas/evas_object_image.c @@ -1123,8 +1123,8 @@ _evas_canvas_image_cache_flush(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e) { evas_canvas_async_block(e); evas_render_rendering_wait(e); - if (e->engine.data.output) - e->engine.func->image_cache_flush(e->engine.data.output); + if (_evas_engine_context(e)) + e->engine.func->image_cache_flush(_evas_engine_context(e)); } EOLIAN void @@ -1178,15 +1178,15 @@ _evas_canvas_image_cache_set(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, int size if (size < 0) size = 0; evas_canvas_async_block(e); evas_render_rendering_wait(e); - if (e->engine.data.output) - e->engine.func->image_cache_set(e->engine.data.output, size); + if (_evas_engine_context(e)) + e->engine.func->image_cache_set(_evas_engine_context(e), size); } EOLIAN int _evas_canvas_image_cache_get(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e) { - if (e->engine.data.output) - return e->engine.func->image_cache_get(e->engine.data.output); + if (_evas_engine_context(e)) + return e->engine.func->image_cache_get(_evas_engine_context(e)); return -1; } @@ -1198,7 +1198,7 @@ _evas_canvas_image_max_size_get(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, int * if (maxw) *maxw = 0xffff; if (maxh) *maxh = 0xffff; if (!e->engine.func->image_max_size_get) return EINA_FALSE; - e->engine.func->image_max_size_get(e->engine.data.output, &w, &h); + e->engine.func->image_max_size_get(_evas_engine_context(e), &w, &h); if (maxw) *maxw = w; if (maxh) *maxh = h; return EINA_TRUE; @@ -2493,7 +2493,7 @@ evas_object_image_render_pre(Evas_Object *eo_obj, { Evas_Coord idw, idh, idx, idy; int x, y, w, h; - e->engine.func->image_dirty_region(e->engine.data.output, o->engine_data, rr->x, rr->y, rr->w, rr->h); + e->engine.func->image_dirty_region(ENDT, o->engine_data, rr->x, rr->y, rr->w, rr->h); idx = evas_object_image_figure_x_fill(eo_obj, obj, o->cur->fill.x, o->cur->fill.w, &idw); idy = evas_object_image_figure_y_fill(eo_obj, obj, o->cur->fill.y, o->cur->fill.h, &idh); @@ -2613,7 +2613,7 @@ evas_object_image_render_pre(Evas_Object *eo_obj, { Eina_Rectangle r; - e->engine.func->image_dirty_region(e->engine.data.output, o->engine_data, rr->x, rr->y, rr->w, rr->h); + e->engine.func->image_dirty_region(ENDT, o->engine_data, rr->x, rr->y, rr->w, rr->h); r.x = rr->x; r.y = rr->y; r.w = rr->w; @@ -2639,7 +2639,7 @@ evas_object_image_render_pre(Evas_Object *eo_obj, eina_rectangle_free(r); } EINA_COW_PIXEL_WRITE_END(o, pixi_write); - e->engine.func->image_dirty_region(e->engine.data.output, o->engine_data, 0, 0, o->cur->image.w, o->cur->image.h); + e->engine.func->image_dirty_region(ENDT, o->engine_data, 0, 0, o->cur->image.w, o->cur->image.h); evas_object_render_pre_prev_cur_add(&e->clip_changes, eo_obj, obj); diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c index c6b4af8..734bee6 100644 --- a/src/lib/evas/canvas/evas_object_main.c +++ b/src/lib/evas/canvas/evas_object_main.c @@ -402,9 +402,7 @@ evas_object_free(Evas_Object *eo_obj, Eina_Bool clean_layer) { if (obj->layer) { - obj->layer->evas->engine.func->image_free - (obj->layer->evas->engine.data.output, - obj->map->surface); + obj->layer->evas->engine.func->image_free(ENC, obj->map->surface); } EINA_COW_WRITE_BEGIN(evas_object_map_cow, obj->map, Evas_Object_Map_Data, map_write) map_write->surface = NULL; @@ -421,8 +419,7 @@ evas_object_free(Evas_Object *eo_obj, Eina_Bool clean_layer) { if (obj->layer) { - obj->layer->evas->engine.func->image_free - (obj->layer->evas->engine.data.output, mask->surface); + obj->layer->evas->engine.func->image_free(ENC, mask->surface); mask->surface = NULL; } } @@ -533,8 +530,7 @@ evas_object_content_change(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj) EINA_COW_WRITE_BEGIN(evas_object_map_cow, obj->map, Evas_Object_Map_Data, map_write) { - obj->layer->evas->engine.func->image_free - (obj->layer->evas->engine.data.output, map_write->surface); + obj->layer->evas->engine.func->image_free(ENC, map_write->surface); map_write->surface = NULL; } EINA_COW_WRITE_END(evas_object_map_cow, obj->map, map_write); @@ -699,7 +695,7 @@ evas_object_render_pre_effect_updates(Eina_Array *rects, Evas_Object *eo_obj, in obj->cur->cache.clip.w, obj->cur->cache.clip.h); if ((w > 0) && (h > 0)) - obj->layer->evas->engine.func->output_redraws_rect_add(e->engine.data.output, + obj->layer->evas->engine.func->output_redraws_rect_add(ENDT, x + e->framespace.x, y + e->framespace.y, w, h); @@ -714,7 +710,7 @@ evas_object_render_pre_effect_updates(Eina_Array *rects, Evas_Object *eo_obj, in obj->prev->cache.clip.w, obj->prev->cache.clip.h); if ((w > 0) && (h > 0)) - obj->layer->evas->engine.func->output_redraws_rect_add(e->engine.data.output, + obj->layer->evas->engine.func->output_redraws_rect_add(ENDT, x + e->framespace.x, y + e->framespace.y, w, h); @@ -737,7 +733,7 @@ evas_object_render_pre_effect_updates(Eina_Array *rects, Evas_Object *eo_obj, in obj->cur->cache.clip.w, obj->cur->cache.clip.h); if ((w > 0) && (h > 0)) - obj->layer->evas->engine.func->output_redraws_rect_add(e->engine.data.output, + obj->layer->evas->engine.func->output_redraws_rect_add(ENDT, x + e->framespace.x, y + e->framespace.y, w, h); @@ -749,7 +745,7 @@ evas_object_render_pre_effect_updates(Eina_Array *rects, Evas_Object *eo_obj, in obj->prev->cache.clip.w, obj->prev->cache.clip.h); if ((w > 0) && (h > 0)) - obj->layer->evas->engine.func->output_redraws_rect_add(e->engine.data.output, + obj->layer->evas->engine.func->output_redraws_rect_add(ENDT, x + e->framespace.x, y + e->framespace.y, w, h); @@ -1711,8 +1707,7 @@ _hide(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj) mask->w = mask->h = 0; if (mask->surface) { - obj->layer->evas->engine.func->image_free - (obj->layer->evas->engine.data.output, mask->surface); + obj->layer->evas->engine.func->image_free(ENC, mask->surface); mask->surface = NULL; } EINA_COW_WRITE_END(evas_object_mask_cow, obj->mask, mask); diff --git a/src/lib/evas/canvas/evas_object_polygon.c b/src/lib/evas/canvas/evas_object_polygon.c index 9707712..b819fdf 100644 --- a/src/lib/evas/canvas/evas_object_polygon.c +++ b/src/lib/evas/canvas/evas_object_polygon.c @@ -262,8 +262,7 @@ evas_object_polygon_free(Evas_Object *eo_obj EINA_UNUSED, { free(list_data); } - o->engine_data = obj->layer->evas->engine.func->polygon_points_clear(obj->layer->evas->engine.data.output, - o->engine_data); + o->engine_data = obj->layer->evas->engine.func->polygon_points_clear(ENC, o->engine_data); } static void @@ -289,13 +288,12 @@ evas_object_polygon_render(Evas_Object *eo_obj EINA_UNUSED, obj->cur->render_op); if (o->changed) { - o->engine_data = obj->layer->evas->engine.func->polygon_points_clear(obj->layer->evas->engine.data.output, - o->engine_data); + o->engine_data = obj->layer->evas->engine.func->polygon_points_clear(ENC, o->engine_data); EINA_LIST_FOREACH(o->points, l, p) { //px = evas_coord_world_x_to_screen(obj->layer->evas, p->x); //py = evas_coord_world_y_to_screen(obj->layer->evas, p->y); - o->engine_data = obj->layer->evas->engine.func->polygon_point_add(obj->layer->evas->engine.data.output, + o->engine_data = obj->layer->evas->engine.func->polygon_point_add(ENC, o->engine_data, p->x, p->y); } diff --git a/src/lib/evas/canvas/evas_object_text.c b/src/lib/evas/canvas/evas_object_text.c index 083e894..aa9b14d 100644 --- a/src/lib/evas/canvas/evas_object_text.c +++ b/src/lib/evas/canvas/evas_object_text.c @@ -16,8 +16,6 @@ #endif /* save typing */ -#define ENFN obj->layer->evas->engine.func -#define ENDT obj->layer->evas->engine.data.output #define COL_OBJECT(obj, sub) ARGB_JOIN(obj->sub->color.a, obj->sub->color.r, obj->sub->color.g, obj->sub->color.b) #define COL_JOIN(o, sub, color) ARGB_JOIN(o->sub.color.a, o->sub.color.r, o->sub.color.g, o->sub.color.b) diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c index 2285e15..0555008 100644 --- a/src/lib/evas/canvas/evas_object_textblock.c +++ b/src/lib/evas/canvas/evas_object_textblock.c @@ -81,10 +81,6 @@ #include "evas_filter.h" #include "efl_canvas_filter_internal.eo.h" -/* save typing */ -#define ENFN obj->layer->evas->engine.func -#define ENDT obj->layer->evas->engine.data.output - /* private magic number for textblock objects */ static const char o_type[] = "textblock"; @@ -974,7 +970,7 @@ _image_safe_unref(Evas_Public_Data *e, void *image, Eina_Bool async) if (async) evas_unref_queue_image_put(e, image); else - e->engine.func->image_free(e->engine.data.output, image); + e->engine.func->image_free(_evas_engine_context(e), image); } /** diff --git a/src/lib/evas/canvas/evas_object_textgrid.c b/src/lib/evas/canvas/evas_object_textgrid.c index 597070a..730df32 100644 --- a/src/lib/evas/canvas/evas_object_textgrid.c +++ b/src/lib/evas/canvas/evas_object_textgrid.c @@ -5,10 +5,6 @@ #define MY_CLASS_NAME "Evas_Textgrid" -/* save typing */ -#define ENFN obj->layer->evas->engine.func -#define ENDT obj->layer->evas->engine.data.output - /* private magic number for text objects */ static const char o_type[] = "textgrid"; @@ -1021,17 +1017,17 @@ _alternate_font_weight_slant(Evas_Object_Protected_Data *obj, int advance, vadvance, ascent; script = evas_common_language_script_type_get(W, 1); - ENFN->font_run_end_get(ENDT, font, &script_fi, &cur_fi, + ENFN->font_run_end_get(ENC, font, &script_fi, &cur_fi, script, W, 1); memset(&text_props, 0, sizeof(Evas_Text_Props)); evas_common_text_props_script_set(&text_props, script); - ENFN->font_text_props_info_create(ENDT, script_fi, W, &text_props, + ENFN->font_text_props_info_create(ENC, script_fi, W, &text_props, NULL, 0, 1, EVAS_TEXT_PROPS_MODE_NONE, fdesc->lang); - advance = ENFN->font_h_advance_get(ENDT, font, &text_props); - vadvance = ENFN->font_v_advance_get(ENDT, font, &text_props); - ascent = ENFN->font_ascent_get(ENDT, font); + advance = ENFN->font_h_advance_get(ENC, font, &text_props); + vadvance = ENFN->font_v_advance_get(ENC, font, &text_props); + ascent = ENFN->font_ascent_get(ENC, font); DBG("on font '%s', with alternate weight/slant %s, " "width: %d vs %d, height: %d vs %d, ascent: %d vs %d", fdesc->name, kind, @@ -1127,19 +1123,19 @@ _evas_textgrid_efl_text_properties_font_set(Eo *eo_obj, int advance, vadvance; script = evas_common_language_script_type_get(W, 1); - ENFN->font_run_end_get(ENDT, o->font_normal, &script_fi, &cur_fi, + ENFN->font_run_end_get(ENC, o->font_normal, &script_fi, &cur_fi, script, W, 1); memset(&text_props, 0, sizeof(Evas_Text_Props)); evas_common_text_props_script_set(&text_props, script); - ENFN->font_text_props_info_create(ENDT, script_fi, W, &text_props, + ENFN->font_text_props_info_create(ENC, script_fi, W, &text_props, NULL, 0, 1, EVAS_TEXT_PROPS_MODE_NONE, fdesc->lang); - advance = ENFN->font_h_advance_get(ENDT, o->font_normal, &text_props); - vadvance = ENFN->font_v_advance_get(ENDT, o->font_normal, &text_props); + advance = ENFN->font_h_advance_get(ENC, o->font_normal, &text_props); + vadvance = ENFN->font_v_advance_get(ENC, o->font_normal, &text_props); o->cur.char_width = advance; o->cur.char_height = vadvance; - o->ascent = ENFN->font_ascent_get(ENDT, o->font_normal); + o->ascent = ENFN->font_ascent_get(ENC, o->font_normal); evas_common_text_props_content_unref(&text_props); } else diff --git a/src/lib/evas/canvas/evas_object_vg.c b/src/lib/evas/canvas/evas_object_vg.c index 57d1587..7de216c 100644 --- a/src/lib/evas/canvas/evas_object_vg.c +++ b/src/lib/evas/canvas/evas_object_vg.c @@ -181,7 +181,7 @@ evas_object_vg_render(Evas_Object *eo_obj EINA_UNUSED, int x, int y, Eina_Bool do_async) { Evas_VG_Data *vd = type_private_data; - Ector_Surface *ector = evas_ector_get(obj->layer->evas); + Ector_Surface *ector = evas_ector_get(obj->layer->evas, output); // FIXME: Set context (that should affect Ector_Surface) and // then call Ector_Renderer render from bottom to top. Get the // Ector_Surface that match the output from Evas engine API. @@ -251,7 +251,7 @@ evas_object_vg_render_pre(Evas_Object *eo_obj, } // FIXME: handle damage only on changed renderer. - s = evas_ector_get(obj->layer->evas); + s = evas_ector_get(obj->layer->evas, _evas_default_output_get(obj->layer->evas)); if (vd->root && s) _evas_vg_render_pre(vd->root, s, NULL); diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index eb4f8f6..7aac4f6 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -96,8 +96,12 @@ rend_dbg(const char *txt) #define OBJS_ARRAY_FLUSH(array) eina_array_flush(array) /* save typing */ +#undef ENFN +#undef ENDT +#undef ENC #define ENFN evas->engine.func -#define ENDT evas->engine.data.output +#define ENDT _evas_default_output_get(evas) +#define ENC _evas_engine_context(evas) typedef struct _Render_Updates Render_Updates; typedef struct _Cutout_Margin Cutout_Margin; @@ -1876,7 +1880,7 @@ evas_render_mapped(Evas_Public_Data *evas, Evas_Object *eo_obj, RD(level, " new surf: %ix%i\n", sw, sh); EINA_COW_WRITE_BEGIN(evas_object_map_cow, obj->map, Evas_Object_Map_Data, map_write) { - ENFN->image_free(ENDT, map_write->surface); + ENFN->image_free(ENC, map_write->surface); map_write->surface = NULL; } EINA_COW_WRITE_END(evas_object_map_cow, obj->map, map_write); @@ -1890,7 +1894,7 @@ evas_render_mapped(Evas_Public_Data *evas, Evas_Object *eo_obj, map_write->surface_h = sh; map_write->surface = ENFN->image_map_surface_new - (ENDT, map_write->surface_w, + (ENC, map_write->surface_w, map_write->surface_h, map_write->cur.map->alpha); } @@ -2328,7 +2332,7 @@ evas_render_proxy_subrender(Evas *eo_e, Evas_Object *eo_source, Evas_Object *eo_ ((proxy_write->w != w) || (proxy_write->h != h))) { RD(level, " free surface: %p\n", proxy_write->surface); - ENFN->image_free(ENDT, proxy_write->surface); + ENFN->image_free(ENC, proxy_write->surface); proxy_write->surface = NULL; } @@ -2337,7 +2341,7 @@ evas_render_proxy_subrender(Evas *eo_e, Evas_Object *eo_source, Evas_Object *eo_ if (!proxy_write->surface) { if ((w < 1) || (h < 1)) goto end; - proxy_write->surface = ENFN->image_map_surface_new(ENDT, w, h, 1); + proxy_write->surface = ENFN->image_map_surface_new(ENC, w, h, 1); RD(level, " created surface: %p %dx%d\n", proxy_write->surface, w, h); if (!proxy_write->surface) goto end; proxy_write->w = w; @@ -2509,7 +2513,7 @@ evas_render_mask_subrender(Evas_Public_Data *evas, * (we don't know how to render objects to alpha) */ if (mdata->surface && ((w != mdata->w) || (h != mdata->h) || mdata->is_alpha || mdata->is_scaled)) { - ENFN->image_free(ENDT, mdata->surface); + ENFN->image_free(ENC, mdata->surface); mdata->surface = NULL; } @@ -2517,7 +2521,7 @@ evas_render_mask_subrender(Evas_Public_Data *evas, if (!mdata->surface) { eina_evlog("+mask_surface_new", mask->object, 0.0, NULL); - mdata->surface = ENFN->image_map_surface_new(ENDT, w, h, EINA_TRUE); + mdata->surface = ENFN->image_map_surface_new(ENC, w, h, EINA_TRUE); eina_evlog("-mask_surface_new", mask->object, 0.0, NULL); if (!mdata->surface) goto end; mdata->is_alpha = EINA_FALSE; @@ -2582,7 +2586,7 @@ evas_render_mask_subrender(Evas_Public_Data *evas, eina_evlog("+mask_new_cpy_data", mask->object, 0.0, NULL); alpha_surface = ENFN->image_new_from_copied_data - (ENDT, w, h, NULL, EINA_TRUE, EVAS_COLORSPACE_GRY8); + (ENC, w, h, NULL, EINA_TRUE, EVAS_COLORSPACE_GRY8); eina_evlog("-mask_new_cpy_data", mask->object, 0.0, NULL); if (!alpha_surface) goto end; @@ -2596,7 +2600,7 @@ evas_render_mask_subrender(Evas_Public_Data *evas, eina_evlog("-mask_cpy_data", mask->object, 0.0, NULL); /* Now we can drop the original surface */ - ENFN->image_free(ENDT, mdata->surface); + ENFN->image_free(ENC, mdata->surface); mdata->surface = alpha_surface; mdata->is_alpha = EINA_TRUE; } @@ -3828,8 +3832,14 @@ _evas_canvas_render_idle_flush(Eo *eo_e, Evas_Public_Data *evas) evas_fonts_zero_pressure(eo_e); - if (ENFN && ENFN->output_idle_flush && ENDT) - ENFN->output_idle_flush(ENDT); + if (ENFN && ENFN->output_idle_flush) + { + Efl_Canvas_Output *output; + Eina_List *l; + + EINA_LIST_FOREACH(evas->outputs, l, output) + ENFN->output_idle_flush(output->output); + } eina_inarray_flush(&evas->active_objects); OBJS_ARRAY_FLUSH(&evas->render_objects); @@ -3865,7 +3875,7 @@ _evas_render_dump_map_surfaces(Evas_Object *eo_obj) if ((obj->map->cur.map) && obj->map->surface) { Evas_Public_Data *evas = obj->layer->evas; - ENFN->image_free(ENDT, obj->map->surface); + ENFN->image_free(ENC, obj->map->surface); EINA_COW_WRITE_BEGIN(evas_object_map_cow, obj->map, Evas_Object_Map_Data, map_write) map_write->surface = NULL; EINA_COW_WRITE_END(evas_object_map_cow, obj->map, map_write); @@ -3904,7 +3914,7 @@ _evas_canvas_render_dump(Eo *eo_e, Evas_Public_Data *evas) { EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, obj->proxy, Evas_Object_Proxy_Data, proxy_write) { - ENFN->image_free(ENDT, proxy_write->surface); + ENFN->image_free(ENC, proxy_write->surface); proxy_write->surface = NULL; } EINA_COW_WRITE_END(evas_object_proxy_cow, obj->proxy, proxy_write); @@ -3913,7 +3923,7 @@ _evas_canvas_render_dump(Eo *eo_e, Evas_Public_Data *evas) { EINA_COW_WRITE_BEGIN(evas_object_mask_cow, obj->mask, Evas_Object_Mask_Data, mdata) { - ENFN->image_free(ENDT, mdata->surface); + ENFN->image_free(ENC, mdata->surface); mdata->surface = NULL; } EINA_COW_WRITE_END(evas_object_mask_cow, obj->mask, mdata); @@ -3925,8 +3935,14 @@ _evas_canvas_render_dump(Eo *eo_e, Evas_Public_Data *evas) lay->walking_objects--; _evas_layer_flush_removes(lay); } - if (ENFN && ENFN->output_dump && ENDT) - ENFN->output_dump(ENDT); + if (ENFN && ENFN->output_dump) + { + Efl_Canvas_Output *output; + Eina_List *l; + + EINA_LIST_FOREACH(evas->outputs, l, output) + ENFN->output_dump(output); + } #define GC_ALL(Cow) \ if (Cow) while (eina_cow_gc(Cow)) @@ -3938,8 +3954,14 @@ _evas_canvas_render_dump(Eo *eo_e, Evas_Public_Data *evas) evas_fonts_zero_pressure(eo_e); - if (ENFN && ENFN->output_idle_flush && ENDT) - ENFN->output_idle_flush(ENDT); + if (ENFN && ENFN->output_idle_flush) + { + Efl_Canvas_Output *output; + Eina_List *l; + + EINA_LIST_FOREACH(evas->outputs, l, output) + ENFN->output_idle_flush(output); + } eina_inarray_flush(&evas->active_objects); OBJS_ARRAY_FLUSH(&evas->render_objects); diff --git a/src/lib/evas/filters/evas_filter.c b/src/lib/evas/filters/evas_filter.c index 08ad0b7..b482740 100644 --- a/src/lib/evas/filters/evas_filter.c +++ b/src/lib/evas/filters/evas_filter.c @@ -89,8 +89,8 @@ evas_filter_context_clear(Evas_Filter_Context *ctx, Eina_Bool keep_buffers) if (!ctx) return; - if (ctx->target.surface) ENFN->image_free(ENDT, ctx->target.surface); - if (ctx->target.mask) ENFN->image_free(ENDT, ctx->target.mask); + if (ctx->target.surface) ENFN->image_free(ENC, ctx->target.surface); + if (ctx->target.mask) ENFN->image_free(ENC, ctx->target.mask); ctx->target.surface = NULL; ctx->target.mask = NULL; @@ -163,7 +163,7 @@ evas_filter_context_proxy_render_all(Evas_Filter_Context *ctx, Eo *eo_obj, } } XDBG("Source #%d '%s' has dimensions %dx%d", fb->id, fb->source_name, fb->w, fb->h); - if (!fb->buffer) fb->buffer = ENFN->ector_buffer_wrap(ENDT, obj->layer->evas->evas, source->proxy->surface); + if (!fb->buffer) fb->buffer = ENFN->ector_buffer_wrap(ENC, obj->layer->evas->evas, source->proxy->surface); fb->alpha_only = EINA_FALSE; } } @@ -268,7 +268,7 @@ _ector_buffer_create(Evas_Filter_Buffer const *fb, Eina_Bool render, Eina_Bool d if (draw) flags |= ECTOR_BUFFER_FLAG_DRAWABLE; if (fb->alpha_only) cspace = EFL_GFX_COLORSPACE_GRY8; - return fb->ENFN->ector_buffer_new(fb->ENDT, fb->ctx->evas->evas, + return fb->ENFN->ector_buffer_new(FB_ENC, fb->ctx->evas->evas, fb->w, fb->h, cspace, flags); } @@ -576,7 +576,7 @@ evas_filter_buffer_backing_set(Evas_Filter_Context *ctx, int bufid, if (fb->is_render) goto end; - buffer = ENFN->ector_buffer_wrap(ENDT, ctx->evas->evas, engine_buffer); + buffer = ENFN->ector_buffer_wrap(ENC, ctx->evas->evas, engine_buffer); ret = EINA_TRUE; end: @@ -860,7 +860,7 @@ _blur_support_gl(Evas_Filter_Context *ctx, Evas_Filter_Buffer *in, Evas_Filter_B cmd.blur.type = EVAS_FILTER_BLUR_GAUSSIAN; cmd.blur.dx = 5; - return cmd.ENFN->gfx_filter_supports(cmd.ENDT, &cmd) == EVAS_FILTER_SUPPORT_GL; + return cmd.ENFN->gfx_filter_supports(_evas_engine_context(cmd.ctx->evas), &cmd) == EVAS_FILTER_SUPPORT_GL; } Evas_Filter_Command * @@ -1542,7 +1542,7 @@ evas_filter_target_set(Evas_Filter_Context *ctx, void *draw_context, EINA_SAFETY_ON_NULL_RETURN_VAL(ctx, EINA_FALSE); - ctx->target.surface = ENFN->image_ref(ENDT, surface); + ctx->target.surface = ENFN->image_ref(ENC, surface); ctx->target.x = x; ctx->target.y = y; ctx->target.clip_use = ENFN->context_clip_get @@ -1568,7 +1568,7 @@ evas_filter_target_set(Evas_Filter_Context *ctx, void *draw_context, ENFN->context_clip_image_get (ENDT, draw_context, &mask, &ctx->target.mask_x, &ctx->target.mask_y); if (ctx->target.mask) - ctx->evas->engine.func->image_free(ctx->evas->engine.data.output, ctx->target.mask); + ctx->evas->engine.func->image_free(_evas_engine_context(ctx->evas), ctx->target.mask); ctx->target.mask = mask; // FIXME: why no ref??? return EINA_TRUE; @@ -1630,13 +1630,13 @@ _filter_target_render(Evas_Filter_Context *ctx) ENFN->context_free(ENDT, drawctx); evas_ector_buffer_engine_image_release(src->buffer, image); - ENFN->image_free(ENDT, surface); + ENFN->image_free(ENC, surface); ctx->target.surface = NULL; return EINA_TRUE; fail: - ENFN->image_free(ENDT, surface); + ENFN->image_free(ENC, surface); ctx->target.surface = NULL; ERR("Failed to render filter to target canvas!"); @@ -1661,7 +1661,7 @@ evas_filter_font_draw(Evas_Filter_Context *ctx, void *draw_context, int bufid, EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EINA_FALSE); // Copied from evas_font_draw_async_check - async_unref = ENFN->font_draw(ENDT, draw_context, surface, + async_unref = ENFN->font_draw(ENC, draw_context, surface, font, x, y, fb->w, fb->h, fb->w, fb->h, text_props, do_async); if (do_async && async_unref) @@ -1782,14 +1782,14 @@ _filter_command_run(Evas_Filter_Command *cmd) return EINA_FALSE; } - support = cmd->ENFN->gfx_filter_supports(cmd->ENDT, cmd); + support = cmd->ENFN->gfx_filter_supports(CMD_ENC, cmd); if (support == EVAS_FILTER_SUPPORT_NONE) { ERR("No function to process this filter (mode %d)", cmd->mode); return EINA_FALSE; } - return cmd->ENFN->gfx_filter_process(cmd->ENDT, cmd); + return cmd->ENFN->gfx_filter_process(CMD_ENC, cmd); } static Eina_Bool diff --git a/src/lib/evas/filters/evas_filter_private.h b/src/lib/evas/filters/evas_filter_private.h index 8ced3d8..f6faea3 100644 --- a/src/lib/evas/filters/evas_filter_private.h +++ b/src/lib/evas/filters/evas_filter_private.h @@ -75,8 +75,16 @@ extern int _evas_filter_log_dom; #endif // Helpers +#undef ENFN +#undef ENDT +#undef ENC #define ENFN ctx->evas->engine.func -#define ENDT ctx->evas->engine.data.output +#define ENDT _evas_default_output_get(ctx->evas) +#define ENC _evas_engine_context(ctx->evas) + +#define CMD_ENDT _evas_default_output_get(cmd->ctx->evas) +#define CMD_ENC _evas_engine_context(cmd->ctx->evas) +#define FB_ENC _evas_engine_context(fb->ctx->evas) #define BUFFERS_LOCK() do { if (cmd->input) cmd->input->locked = 1; if (cmd->output) cmd->output->locked = 1; if (cmd->mask) cmd->mask->locked = 1; } while (0) #define BUFFERS_UNLOCK() do { if (cmd->input) cmd->input->locked = 0; if (cmd->output) cmd->output->locked = 0; if (cmd->mask) cmd->mask->locked = 0; } while (0) diff --git a/src/lib/evas/include/evas_inline.x b/src/lib/evas/include/evas_inline.x index 37cf44d..d2b6a70 100644 --- a/src/lib/evas/include/evas_inline.x +++ b/src/lib/evas/include/evas_inline.x @@ -339,6 +339,28 @@ _evas_eina_rectangle_inside(const Eina_Rectangle *big, const Eina_Rectangle *sma return EINA_FALSE; } +// Temporary until we have multi output support +static inline void * +_evas_default_output_get(Evas_Public_Data *e) +{ + Efl_Canvas_Output *output; + + output = eina_list_data_get(e->outputs); + return output->output; +} + +static inline void * +_evas_engine_context(Evas_Public_Data *e) +{ + // Need to split between engine context + // and output context, use one for now. + Efl_Canvas_Output *output; + + if (!e->outputs) return NULL; + output = eina_list_data_get(e->outputs); + return output->output; +} + #define _EVAS_COLOR_CLAMP(x, y) do { \ if (x > y) { x = y; bad = 1; } \ if (x < 0) { x = 0; bad = 1; } } while (0) diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index 92e149e..3c7ec16 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -46,6 +46,11 @@ # endif #endif /* ! _WIN32 */ +/* save typing */ +#define ENFN obj->layer->evas->engine.func +#define ENDT _evas_default_output_get(obj->layer->evas) +#define ENC _evas_engine_context(obj->layer->evas) + #include "canvas/evas_text.eo.h" #include "canvas/evas_textgrid.eo.h" #include "canvas/evas_line.eo.h" @@ -873,13 +878,6 @@ struct _Evas_Public_Data struct { Evas_Module *module; Evas_Func *func; - Ector_Surface *ector; - struct { - void *output; - } data; - - void *info; - int info_magic; } engine; struct { @@ -1291,8 +1289,12 @@ struct _Efl_Canvas_Output { Eo *canvas; + Ector_Surface *ector; + void *info, *output; Evas_Coord x, y, w, h; + + int info_magic; }; struct _Evas_Object_Func @@ -1558,7 +1560,7 @@ struct _Evas_Func void (*texture_image_set) (void *data, void *texture, void *image); void *(*texture_image_get) (void *data, void *texture); - Ector_Surface *(*ector_create) (void *data); + Ector_Surface *(*ector_create) (void *engine, void *output); void (*ector_destroy) (void *data, Ector_Surface *surface); Ector_Buffer *(*ector_buffer_wrap) (void *data, Evas *e, void *engine_image); Ector_Buffer *(*ector_buffer_new) (void *data, Evas *e, int width, int height, Efl_Gfx_Colorspace cspace, Ector_Buffer_Flag flags); @@ -1890,7 +1892,7 @@ void evas_filter_init(void); void evas_filter_shutdown(void); /* Ector */ -Ector_Surface *evas_ector_get(Evas_Public_Data *evas); +Ector_Surface *evas_ector_get(Evas_Public_Data *evas, void *output); /* Temporary save/load functions */ void evas_common_load_model_from_file(Evas_Canvas3D_Mesh *model, const char *file); diff --git a/src/modules/evas/engines/gl_generic/evas_ector_gl_buffer.c b/src/modules/evas/engines/gl_generic/evas_ector_gl_buffer.c index 63af1d1..26c2c47 100644 --- a/src/modules/evas/engines/gl_generic/evas_ector_gl_buffer.c +++ b/src/modules/evas/engines/gl_generic/evas_ector_gl_buffer.c @@ -45,8 +45,12 @@ struct _Evas_Ector_GL_Buffer_Data Ector_GL_Buffer_Map *maps; }; +#undef ENFN +#undef ENDT +#undef ENC + #define ENFN pd->evas->engine.func -#define ENDT pd->evas->engine.data.output +#define ENC _evas_engine_context(pd->evas) // testing out some macros to maybe add to eina #define EINA_INLIST_REMOVE(l,i) do { l = (__typeof__(l)) eina_inlist_remove(EINA_INLIST_GET(l), EINA_INLIST_GET(i)); } while (0) @@ -119,8 +123,9 @@ _evas_ector_gl_buffer_gl_buffer_prepare(Eo *obj, Evas_Ector_GL_Buffer_Data *pd, else fail("Unsupported colorspace: %u", cspace); + // FIXME: we should not rely on evas canvas in the module (just evas engine) pd->evas = efl_data_xref(eo_evas, EVAS_CANVAS_CLASS, obj); - re = pd->evas->engine.data.output; + re = ENC; gc = re->window_gl_context_get(re->software.ob); im = evas_gl_common_image_surface_new(gc, w, h, EINA_TRUE, EINA_FALSE); @@ -238,12 +243,12 @@ _evas_ector_gl_buffer_ector_buffer_map(Eo *obj EINA_UNUSED, Evas_Ector_GL_Buffer if (write && _evas_gl_image_is_fbo(pd->glim)) { // Can not open FBO data to write! - im = ENFN->image_data_get(ENDT, pd->glim, EINA_FALSE, &data, &err, &tofree); + im = ENFN->image_data_get(ENC, pd->glim, EINA_FALSE, &data, &err, &tofree); if (!im) return NULL; } else { - im = ENFN->image_data_get(ENDT, pd->glim, write, &data, &err, &tofree); + im = ENFN->image_data_get(ENC, pd->glim, write, &data, &err, &tofree); if (!im) return NULL; } @@ -333,12 +338,12 @@ _evas_ector_gl_buffer_ector_buffer_unmap(Eo *obj EINA_UNUSED, Evas_Ector_GL_Buff if (map->im) { MAP_DUMP(map->im, "out_ro_free"); - ENFN->image_free(ENDT, map->im); + ENFN->image_free(ENC, map->im); } else { MAP_DUMP(pd->glim, "out_ro_nofree"); - ENFN->image_data_put(ENDT, pd->glim, map->image_data); + ENFN->image_data_put(ENC, pd->glim, map->image_data); } } if (map->allocated) diff --git a/src/modules/evas/engines/gl_generic/evas_ector_gl_image_buffer.c b/src/modules/evas/engines/gl_generic/evas_ector_gl_image_buffer.c index 5f35cc8..157c0e1 100644 --- a/src/modules/evas/engines/gl_generic/evas_ector_gl_image_buffer.c +++ b/src/modules/evas/engines/gl_generic/evas_ector_gl_image_buffer.c @@ -43,8 +43,13 @@ struct _Evas_Ector_GL_Image_Buffer_Data Ector_GL_Buffer_Map *maps; }; +#undef ENFN +#undef ENDT +#undef ENC + +// FIXME: It should not use evas canvas, just the engine #define ENFN pd->evas->engine.func -#define ENDT pd->evas->engine.data.output +#define ENC _evas_engine_context(pd->evas) // testing out some macros to maybe add to eina #define EINA_INLIST_REMOVE(l,i) do { l = (__typeof__(l)) eina_inlist_remove(EINA_INLIST_GET(l), EINA_INLIST_GET(i)); } while (0) @@ -77,7 +82,7 @@ _evas_ector_gl_image_buffer_evas_ector_buffer_engine_image_set(Eo *obj, Evas_Ect evas = efl_data_xref(eo_evas, EVAS_CANVAS_CLASS, obj); if (!im->tex) { - Render_Engine_GL_Generic *re = pd->evas->engine.data.output; + Render_Engine_GL_Generic *re = ENC; Evas_Engine_GL_Context *gc; gc = re->window_gl_context_get(re->software.ob); @@ -183,7 +188,7 @@ _evas_ector_gl_image_buffer_ector_buffer_map(Eo *obj EINA_UNUSED, Evas_Ector_GL_ if (!h) h = H - y; if ((x + w > W) || (y + h > H)) return NULL; - im = ENFN->image_data_get(ENDT, pd->glim, EINA_FALSE, &data, &err, &tofree); + im = ENFN->image_data_get(ENC, pd->glim, EINA_FALSE, &data, &err, &tofree); if (!im) return NULL; map = calloc(1, sizeof(*map)); @@ -247,9 +252,9 @@ _evas_ector_gl_image_buffer_ector_buffer_unmap(Eo *obj EINA_UNUSED, { EINA_INLIST_REMOVE(pd->maps, map); if (map->free_image) - ENFN->image_free(ENDT, map->im); + ENFN->image_free(ENC, map->im); else - ENFN->image_data_put(ENDT, map->im, map->image_data); + ENFN->image_data_put(ENC, map->im, map->image_data); if (map->allocated) free(map->base_data); free(map); diff --git a/src/modules/evas/engines/gl_generic/evas_engine.c b/src/modules/evas/engines/gl_generic/evas_engine.c index c8bfb80..951f656 100644 --- a/src/modules/evas/engines/gl_generic/evas_engine.c +++ b/src/modules/evas/engines/gl_generic/evas_engine.c @@ -2434,7 +2434,7 @@ static Eina_Bool use_cairo = EINA_FALSE; static Eina_Bool use_gl = EINA_FALSE; static Ector_Surface * -eng_ector_create(void *data EINA_UNUSED) +eng_ector_create(void *engine EINA_UNUSED, void *output EINA_UNUSED) { Ector_Surface *ector; const char *ector_backend; diff --git a/src/modules/evas/engines/software_generic/evas_engine.c b/src/modules/evas/engines/software_generic/evas_engine.c index 3947af6..84bd52f 100644 --- a/src/modules/evas/engines/software_generic/evas_engine.c +++ b/src/modules/evas/engines/software_generic/evas_engine.c @@ -4306,7 +4306,7 @@ eng_output_idle_flush(void *data) static Eina_Bool use_cairo; static Ector_Surface * -eng_ector_create(void *data EINA_UNUSED) +eng_ector_create(void *engine EINA_UNUSED, void *output EINA_UNUSED) { Ector_Surface *ector; const char *ector_backend; diff --git a/src/modules/evas/engines/software_generic/filters/evas_filter_blend.c b/src/modules/evas/engines/software_generic/filters/evas_filter_blend.c index 4f3615d..57c9567 100644 --- a/src/modules/evas/engines/software_generic/filters/evas_filter_blend.c +++ b/src/modules/evas/engines/software_generic/filters/evas_filter_blend.c @@ -222,7 +222,7 @@ _filter_blend_cpu_generic_do(Evas_Filter_Command *cmd, draw_func image_draw) dc.rop = cmd->draw.rop; dc.color = ARGB_JOIN(cmd->draw.A, cmd->draw.R, cmd->draw.G, cmd->draw.B); - ret = _mapped_blend(cmd->ENDT, &dc, src, src_stride, dst, dst_stride, cmd->draw.fillmode, + ret = _mapped_blend(CMD_ENDT, &dc, src, src_stride, dst, dst_stride, cmd->draw.fillmode, sx, sy, sw, sh, dx, dy, dw, dh, image_draw); end: --