From 251389fefd6df762e9369e5b389c62c4bb1d481f Mon Sep 17 00:00:00 2001 From: Jean-Philippe Andre Date: Wed, 29 Oct 2014 15:10:03 +0900 Subject: [PATCH] Evas filters: Fix COW usage. Thanks cedric for the report. We'll need a new function (after 1.12) to detect if the current cow pointer is the default data or not. Maybe eina_cow_default_get() or maybe something just returning a bool. --- src/lib/evas/canvas/evas_object_main.c | 1 + src/lib/evas/canvas/evas_object_text.c | 29 +++++++++++++++----------- src/lib/evas/include/evas_private.h | 2 ++ 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c index fded1ceee6..ac1f53eac2 100644 --- a/src/lib/evas/canvas/evas_object_main.c +++ b/src/lib/evas/canvas/evas_object_main.c @@ -35,6 +35,7 @@ static const Evas_Object_Protected_State default_state = { static const Evas_Object_Filter_Data default_filter = { NULL, NULL, NULL, NULL, EINA_FALSE, EINA_FALSE }; +const void * const evas_object_filter_cow_default = &default_filter; Eina_Cow *evas_object_proxy_cow = NULL; Eina_Cow *evas_object_map_cow = NULL; diff --git a/src/lib/evas/canvas/evas_object_text.c b/src/lib/evas/canvas/evas_object_text.c index 3cf8df3242..8eadf07f17 100644 --- a/src/lib/evas/canvas/evas_object_text.c +++ b/src/lib/evas/canvas/evas_object_text.c @@ -403,7 +403,8 @@ _evas_text_efl_text_properties_font_source_get(Eo *eo_obj EINA_UNUSED, Evas_Text static inline void _evas_text_filter_changed_set(Evas_Text_Data *o, Eina_Bool val) { - if (o->cur.filter && (o->cur.filter->changed != val)) + if ((evas_object_filter_cow_default != o->cur.filter) + && (o->cur.filter->changed != val)) { EINA_COW_WRITE_BEGIN(evas_object_filter_cow, o->cur.filter, Evas_Object_Filter_Data, fcow) fcow->changed = val; @@ -1542,17 +1543,21 @@ evas_object_text_free(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj) Evas_Text_Data *o = eo_data_scope_get(eo_obj, MY_CLASS); /* free filter output */ - EINA_COW_WRITE_BEGIN(evas_object_filter_cow, o->cur.filter, Evas_Object_Filter_Data, fcow) - if (fcow->output) - ENFN->image_free(ENDT, fcow->output); - eina_hash_free(fcow->sources); - evas_filter_program_del(fcow->chain); - eina_stringshare_del(fcow->code); - fcow->output = NULL; - fcow->chain = NULL; - fcow->sources = NULL; - fcow->code = NULL; - EINA_COW_WRITE_END(evas_object_filter_cow, o->cur.filter, fcow); + if (evas_object_filter_cow_default != o->cur.filter) + { + EINA_COW_WRITE_BEGIN(evas_object_filter_cow, o->cur.filter, Evas_Object_Filter_Data, fcow) + if (fcow->output) + ENFN->image_free(ENDT, fcow->output); + eina_hash_free(fcow->sources); + evas_filter_program_del(fcow->chain); + eina_stringshare_del(fcow->code); + fcow->output = NULL; + fcow->chain = NULL; + fcow->sources = NULL; + fcow->code = NULL; + EINA_COW_WRITE_END(evas_object_filter_cow, o->cur.filter, fcow); + eina_cow_free(evas_object_filter_cow, (const Eina_Cow_Data **) &o->cur.filter); + } /* free obj */ _evas_object_text_items_clear(o); diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index eff901bb83..fd37c29d03 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -1715,6 +1715,8 @@ extern Eina_Cow *evas_object_image_load_opts_cow; extern Eina_Cow *evas_object_image_state_cow; extern Eina_Cow *evas_object_filter_cow; +// This should be replaced by something like "eina_cow_default_get()" maybe +extern const void * const evas_object_filter_cow_default; # define EINA_COW_STATE_WRITE_BEGIN(Obj, Write, State) \ EINA_COW_WRITE_BEGIN(evas_object_state_cow, Obj->State, \