summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/evas/canvas/evas_filter_mixin.c30
-rw-r--r--src/modules/evas/engines/software_generic/evas_ector_software_buffer.c20
-rw-r--r--src/modules/evas/engines/software_generic/evas_engine.c10
3 files changed, 36 insertions, 24 deletions
diff --git a/src/lib/evas/canvas/evas_filter_mixin.c b/src/lib/evas/canvas/evas_filter_mixin.c
index 04d1bea99b..7eb8b1466f 100644
--- a/src/lib/evas/canvas/evas_filter_mixin.c
+++ b/src/lib/evas/canvas/evas_filter_mixin.c
@@ -20,6 +20,7 @@ typedef struct _Evas_Filter_Post_Render_Data Evas_Filter_Post_Render_Data;
struct _Evas_Filter_Data
{
const Evas_Object_Filter_Data *data;
+ Evas_Object_Protected_Data *obj;
Eina_Bool has_cb;
SLK(lck);
Eina_List *post_data;
@@ -75,9 +76,8 @@ _filter_end_sync(Evas_Filter_Context *ctx, Evas_Object_Protected_Data *obj,
static void
_render_post_cb(void *data, const Efl_Event *event EINA_UNUSED)
{
- Eo *eo_obj = data;
- Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
- Evas_Filter_Data *pd = efl_data_scope_get(eo_obj, MY_CLASS);
+ Evas_Filter_Data *pd = data;
+ Evas_Object_Protected_Data *obj = pd->obj;
Eina_List *post_data;
Evas_Filter_Post_Render_Data *task;
@@ -96,16 +96,14 @@ _render_post_cb(void *data, const Efl_Event *event EINA_UNUSED)
static void
_filter_cb(Evas_Filter_Context *ctx, void *data, Eina_Bool success)
{
- Eo *eo_obj = data;
- Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
- Evas_Filter_Data *pd = efl_data_scope_get(eo_obj, MY_CLASS);
Evas_Filter_Post_Render_Data *post_data;
+ Evas_Filter_Data *pd = data;
if (!pd)
return;
if (!pd->data->async)
{
- _filter_end_sync(ctx, obj, pd, success);
+ _filter_end_sync(ctx, pd->obj, pd, success);
return;
}
@@ -267,7 +265,7 @@ evas_filter_object_render(Eo *eo_obj, Evas_Object_Protected_Data *obj,
{
// Post render callback is not required anymore
Evas *e = obj->layer->evas->evas;
- efl_event_callback_del(e, EFL_CANVAS_EVENT_RENDER_POST, _render_post_cb, eo_obj);
+ efl_event_callback_del(e, EFL_CANVAS_EVENT_RENDER_POST, _render_post_cb, pd);
pd->has_cb = EINA_FALSE;
}
@@ -327,10 +325,10 @@ evas_filter_object_render(Eo *eo_obj, Evas_Object_Protected_Data *obj,
if (do_async && !pd->has_cb)
{
Evas *e = obj->layer->evas->evas;
- efl_event_callback_add(e, EFL_CANVAS_EVENT_RENDER_POST, _render_post_cb, eo_obj);
+ efl_event_callback_add(e, EFL_CANVAS_EVENT_RENDER_POST, _render_post_cb, pd);
pd->has_cb = EINA_TRUE;
}
- evas_filter_context_post_run_callback_set(filter, _filter_cb, eo_obj);
+ evas_filter_context_post_run_callback_set(filter, _filter_cb, pd);
ok = evas_filter_run(filter);
fcow = FCOW_BEGIN(pd);
@@ -357,7 +355,7 @@ EOLIAN static void
_efl_canvas_filter_internal_efl_gfx_filter_filter_program_set(Eo *eo_obj, Evas_Filter_Data *pd,
const char *code, const char *name)
{
- Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
+ Evas_Object_Protected_Data *obj = pd->obj;
Evas_Filter_Program *pgm = NULL;
Evas_Object_Filter_Data *fcow;
Eina_Bool alpha;
@@ -410,7 +408,7 @@ EOLIAN static void
_efl_canvas_filter_internal_efl_gfx_filter_filter_source_set(Eo *eo_obj, Evas_Filter_Data *pd,
const char *name, Efl_Gfx *eo_source)
{
- Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
+ Evas_Object_Protected_Data *obj = pd->obj;
Evas_Filter_Proxy_Binding *pb, *pb_old = NULL;
Evas_Object_Protected_Data *source = NULL;
Evas_Object_Filter_Data *fcow = NULL;
@@ -504,7 +502,7 @@ _efl_canvas_filter_internal_efl_gfx_filter_filter_state_set(Eo *eo_obj, Evas_Fil
const char *next_state, double next_val,
double pos)
{
- Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
+ Evas_Object_Protected_Data *obj = pd->obj;
evas_object_async_block(obj);
if ((cur_state != pd->data->state.cur.name) || (cur_val != pd->data->state.cur.value) ||
@@ -589,6 +587,7 @@ _efl_canvas_filter_internal_efl_object_constructor(Eo *eo_obj, Evas_Filter_Data
obj = efl_constructor(efl_super(eo_obj, MY_CLASS));
pd->data = eina_cow_alloc(evas_object_filter_cow);
+ pd->obj = efl_data_ref(eo_obj, EFL_CANVAS_OBJECT_CLASS);
SLKI(pd->lck);
return obj;
@@ -597,7 +596,7 @@ _efl_canvas_filter_internal_efl_object_constructor(Eo *eo_obj, Evas_Filter_Data
EOLIAN static void
_efl_canvas_filter_internal_efl_object_destructor(Eo *eo_obj, Evas_Filter_Data *pd)
{
- Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
+ Evas_Object_Protected_Data *obj = pd->obj;
Evas_Filter_Data_Binding *db;
Eina_Inlist *il;
@@ -628,9 +627,10 @@ finish:
if (pd->has_cb)
{
Evas *e = obj->layer->evas->evas;
- efl_event_callback_del(e, EFL_CANVAS_EVENT_RENDER_POST, _render_post_cb, eo_obj);
+ efl_event_callback_del(e, EFL_CANVAS_EVENT_RENDER_POST, _render_post_cb, pd);
}
SLKD(pd->lck);
+ efl_data_unref(eo_obj, pd->obj);
efl_destructor(efl_super(eo_obj, MY_CLASS));
}
diff --git a/src/modules/evas/engines/software_generic/evas_ector_software_buffer.c b/src/modules/evas/engines/software_generic/evas_ector_software_buffer.c
index a6dc80e0d4..061d5fbd89 100644
--- a/src/modules/evas/engines/software_generic/evas_ector_software_buffer.c
+++ b/src/modules/evas/engines/software_generic/evas_ector_software_buffer.c
@@ -13,7 +13,7 @@
typedef struct {
Ector_Software_Buffer_Base_Data *base;
- Evas *evas;
+ Evas_Public_Data *evas;
RGBA_Image *image;
} Evas_Ector_Software_Buffer_Data;
@@ -39,7 +39,7 @@ _evas_ector_software_buffer_evas_ector_buffer_engine_image_set(Eo *obj, Evas_Ect
return;
}
- pd->evas = efl_xref(evas, obj);
+ pd->evas = efl_data_xref(evas, EVAS_CANVAS_CLASS, obj);
evas_cache_image_ref(&im->cache_entry);
pd->image = im;
@@ -51,10 +51,15 @@ _evas_ector_software_buffer_evas_ector_buffer_engine_image_get(Eo *obj EINA_UNUS
Evas_Ector_Software_Buffer_Data *pd,
Evas **evas, void **image)
{
- Evas_Public_Data *e = efl_data_scope_get(pd->evas, EVAS_CANVAS_CLASS);
-
- if (evas) *evas = pd->evas;
- if (e->engine.func->gl_surface_read_pixels)
+ if (!pd->evas)
+ {
+ INF("evas_ector_buffer_engine_image_set was not called on this image");
+ if (evas) *evas = NULL;
+ if (image) *image = NULL;
+ return;
+ }
+ if (evas) *evas = pd->evas->evas;
+ if (pd->evas->engine.func->gl_surface_read_pixels)
{
ERR("Invalid: requesting engine_image from a GL image from a simple SW buffer!");
if (image) *image = NULL;
@@ -86,7 +91,8 @@ _evas_ector_software_buffer_efl_object_destructor(Eo *obj, Evas_Ector_Software_B
{
efl_data_xunref(obj, pd->base, obj);
evas_cache_image_drop(&pd->image->cache_entry);
- efl_xunref(pd->evas, obj);
+ if (pd->evas)
+ efl_data_xunref(pd->evas->evas, pd->evas, obj);
efl_destructor(efl_super(obj, MY_CLASS));
}
diff --git a/src/modules/evas/engines/software_generic/evas_engine.c b/src/modules/evas/engines/software_generic/evas_engine.c
index 7ab8ba443a..05ffaf1ee8 100644
--- a/src/modules/evas/engines/software_generic/evas_engine.c
+++ b/src/modules/evas/engines/software_generic/evas_engine.c
@@ -4283,7 +4283,10 @@ eng_ector_buffer_wrap(void *data EINA_UNUSED, Evas *e, void *engine_image, Eina_
if (!ie) return NULL;
- buf = efl_add(EVAS_ECTOR_SOFTWARE_BUFFER_CLASS, e, evas_ector_buffer_engine_image_set(efl_added, e, ie));
+ if (!efl_domain_current_push(EFL_ID_DOMAIN_SHARED))
+ return NULL;
+ buf = efl_add(EVAS_ECTOR_SOFTWARE_BUFFER_CLASS, NULL, evas_ector_buffer_engine_image_set(efl_added, e, ie));
+ efl_domain_current_pop();
return buf;
}
@@ -4302,7 +4305,10 @@ eng_ector_buffer_new(void *data EINA_UNUSED, Evas *evas, void *pixels,
if ((flags & (ECTOR_BUFFER_FLAG_RENDERABLE | ECTOR_BUFFER_FLAG_DRAWABLE)) == 0)
{
- buf = efl_add(ECTOR_SOFTWARE_BUFFER_CLASS, evas, ector_buffer_pixels_set(efl_added, pixels, width, height, stride, cspace, writeable, l, r, t, b));
+ if (!efl_domain_current_push(EFL_ID_DOMAIN_SHARED))
+ return NULL;
+ buf = efl_add(ECTOR_SOFTWARE_BUFFER_CLASS, NULL, ector_buffer_pixels_set(efl_added, pixels, width, height, stride, cspace, writeable, l, r, t, b));
+ efl_domain_current_pop();
}
else
{