cedric pushed a commit to branch master.
commit e0f2ddaddec17c86a795312226641a591b193247
Author: Cedric Bail <[email protected]>
Date: Thu Apr 11 13:21:54 2013 +0900
evas: use eo_data_get less. Use clipees_has if you want to know the number
of child now.
---
src/lib/evas/Evas.h | 21 ++++++++
src/lib/evas/canvas/evas_callbacks.c | 22 ++++----
src/lib/evas/canvas/evas_clip.c | 69 +++++++++++++++++--------
src/lib/evas/canvas/evas_object_main.c | 26 ++++++----
src/lib/evas/canvas/evas_object_smart_clipped.c | 2 +-
src/lib/evas/include/evas_private.h | 2 +
6 files changed, 97 insertions(+), 45 deletions(-)
diff --git a/src/lib/evas/Evas.h b/src/lib/evas/Evas.h
index 86d0beb..33bcfcc 100644
--- a/src/lib/evas/Evas.h
+++ b/src/lib/evas/Evas.h
@@ -4765,6 +4765,15 @@ EAPI void evas_object_clip_unset(Evas_Object
*obj);
EAPI const Eina_List *evas_object_clipees_get(const Evas_Object *obj)
EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1);
/**
+ * Test if any object is clipped by @p obj.
+ *
+ * @param obj The object to get a list of clippees from
+ * @return EINA_TRUE if @p obj clip any object.
+ * @since 1.8
+ */
+EAPI Eina_Bool evas_object_clipees_has(const Evas_Object *eo_obj)
EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1);
+
+/**
* Sets or unsets a given object as the currently focused one on its
* canvas.
*
@@ -17483,6 +17492,7 @@ enum
EVAS_OBJ_SUB_ID_CLIP_GET,
EVAS_OBJ_SUB_ID_CLIP_UNSET,
EVAS_OBJ_SUB_ID_CLIPEES_GET,
+ EVAS_OBJ_SUB_ID_CLIPEES_HAS,
EVAS_OBJ_SUB_ID_MAP_ENABLE_SET,
EVAS_OBJ_SUB_ID_MAP_ENABLE_GET,
EVAS_OBJ_SUB_ID_MAP_SET,
@@ -18136,6 +18146,17 @@ enum
#define evas_obj_clipees_get(clipees)
EVAS_OBJ_ID(EVAS_OBJ_SUB_ID_CLIPEES_GET), EO_TYPECHECK(const Eina_List **,
clipees)
/**
+ * @def evas_obj_clipees_has
+ * @since 1.8
+ * Return a list of objects currently clipped by @p obj.
+ *
+ * @param[out] clipees out
+ *
+ * @see evas_object_clipees_has
+ */
+#define evas_obj_clipees_has(clipees_has)
EVAS_OBJ_ID(EVAS_OBJ_SUB_ID_CLIPEES_HAS), EO_TYPECHECK(const Eina_Bool *,
clipees_has)
+
+/**
* @def evas_obj_focus_set
* @since 1.8
* Sets or unsets a given object as the currently focused one on its
diff --git a/src/lib/evas/canvas/evas_callbacks.c
b/src/lib/evas/canvas/evas_callbacks.c
index fac0a0c..4bda335 100644
--- a/src/lib/evas/canvas/evas_callbacks.c
+++ b/src/lib/evas/canvas/evas_callbacks.c
@@ -1,8 +1,8 @@
#include "evas_common.h"
#include "evas_private.h"
-static void evas_object_event_callback_clear(Evas_Object *eo_obj);
-static void evas_event_callback_clear(Evas *eo_e);
+static void evas_object_event_callback_clear(Evas_Object_Protected_Data *obj);
+static void evas_event_callback_clear(Evas_Public_Data *e);
int _evas_event_counter = 0;
EVAS_MEMPOOL(_mp_fn);
@@ -170,9 +170,8 @@ evas_event_callback_list_post_free(Eina_Inlist **list)
}
static void
-evas_object_event_callback_clear(Evas_Object *eo_obj)
+evas_object_event_callback_clear(Evas_Object_Protected_Data *obj)
{
- Evas_Object_Protected_Data *obj = eo_data_get(eo_obj, EVAS_OBJ_CLASS);
if (!obj) return;
if (!obj->callbacks) return;
if (!obj->callbacks->deletions_waiting) return;
@@ -186,9 +185,8 @@ evas_object_event_callback_clear(Evas_Object *eo_obj)
}
static void
-evas_event_callback_clear(Evas *eo_e)
+evas_event_callback_clear(Evas_Public_Data *e)
{
- Evas_Public_Data *e = eo_data_get(eo_e, EVAS_CLASS);
if (!e) return;
if (!e->callbacks) return;
if (!e->callbacks->deletions_waiting) return;
@@ -277,7 +275,7 @@ evas_event_callback_call(Evas *eo_e, Evas_Callback_Type
type, void *event_info)
e->callbacks->walking_list--;
if (!e->callbacks->walking_list)
{
- evas_event_callback_clear(eo_e);
+ evas_event_callback_clear(e);
l_mod = NULL;
}
}
@@ -361,7 +359,7 @@ evas_object_event_callback_call(Evas_Object *eo_obj,
Evas_Object_Protected_Data
obj->callbacks->walking_list--;
if (!obj->callbacks->walking_list)
{
- evas_object_event_callback_clear(eo_obj);
+ evas_object_event_callback_clear(obj);
l_mod = NULL;
}
@@ -477,7 +475,7 @@ evas_object_event_callback_del(Evas_Object *eo_obj,
Evas_Callback_Type type, Eva
fn->delete_me = 1;
obj->callbacks->deletions_waiting = 1;
if (!obj->callbacks->walking_list)
- evas_object_event_callback_clear(eo_obj);
+ evas_object_event_callback_clear(obj);
return tmp;
}
}
@@ -510,7 +508,7 @@ evas_object_event_callback_del_full(Evas_Object *eo_obj,
Evas_Callback_Type type
fn->delete_me = 1;
obj->callbacks->deletions_waiting = 1;
if (!obj->callbacks->walking_list)
- evas_object_event_callback_clear(eo_obj);
+ evas_object_event_callback_clear(obj);
return tmp;
}
}
@@ -585,7 +583,7 @@ evas_event_callback_del(Evas *eo_e, Evas_Callback_Type
type, Evas_Event_Cb func)
fn->delete_me = 1;
e->callbacks->deletions_waiting = 1;
if (!e->callbacks->walking_list)
- evas_event_callback_clear(eo_e);
+ evas_event_callback_clear(e);
return data;
}
}
@@ -618,7 +616,7 @@ evas_event_callback_del_full(Evas *eo_e, Evas_Callback_Type
type, Evas_Event_Cb
fn->delete_me = 1;
e->callbacks->deletions_waiting = 1;
if (!e->callbacks->walking_list)
- evas_event_callback_clear(eo_e);
+ evas_event_callback_clear(e);
return tmp;
}
}
diff --git a/src/lib/evas/canvas/evas_clip.c b/src/lib/evas/canvas/evas_clip.c
index 5dfdc55..75c9d20 100644
--- a/src/lib/evas/canvas/evas_clip.c
+++ b/src/lib/evas/canvas/evas_clip.c
@@ -4,9 +4,8 @@
void
evas_object_clip_dirty(Evas_Object *eo_obj EINA_UNUSED,
Evas_Object_Protected_Data *obj)
{
+ Evas_Object_Protected_Data *clipee;
Eina_List *l;
- Evas_Object *data;
- Evas_Object_Protected_Data *clipee = NULL;
if (obj->cur->cache.clip.dirty) return;
@@ -16,25 +15,23 @@ evas_object_clip_dirty(Evas_Object *eo_obj EINA_UNUSED,
Evas_Object_Protected_Da
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
- EINA_LIST_FOREACH(obj->clip.clipees, l, data)
+ EINA_LIST_FOREACH(obj->clip.clipees, l, clipee)
{
- clipee = eo_data_get(data, EVAS_OBJ_CLASS);
- evas_object_clip_dirty(data, clipee);
+ evas_object_clip_dirty(clipee->object, clipee);
}
}
void
evas_object_recalc_clippees(Evas_Object_Protected_Data *obj)
{
+ Evas_Object_Protected_Data *clipee;
Eina_List *l;
- Evas_Object *data;
if (obj->cur->cache.clip.dirty)
{
evas_object_clip_recalc(obj);
- EINA_LIST_FOREACH(obj->clip.clipees, l, data)
+ EINA_LIST_FOREACH(obj->clip.clipees, l, clipee)
{
- Evas_Object_Protected_Data *clipee = eo_data_get(data,
EVAS_OBJ_CLASS);
evas_object_recalc_clippees(clipee);
}
}
@@ -120,13 +117,12 @@ evas_object_child_map_across_mark(Evas_Object *eo_obj,
Evas_Object_Protected_Dat
}
else if (obj->clip.clipees)
{
+ Evas_Object_Protected_Data *obj2;
Eina_List *l;
- Evas_Object *eo_obj2;
- EINA_LIST_FOREACH(obj->clip.clipees, l, eo_obj2)
+ EINA_LIST_FOREACH(obj->clip.clipees, l, obj2)
{
- Evas_Object_Protected_Data *obj2 = eo_data_get(eo_obj2,
EVAS_OBJ_CLASS);
- evas_object_child_map_across_mark(eo_obj2, obj2, map_obj,
force);
+ evas_object_child_map_across_mark(obj2->object, obj2,
map_obj, force);
}
}
}
@@ -147,8 +143,8 @@ void
evas_object_clip_across_clippees_check(Evas_Object *eo_obj,
Evas_Object_Protected_Data *obj)
{
#ifdef MAP_ACROSS
+ Evas_Object_Protected_Data *obj2;
Eina_List *l;
- Evas_Object *eo_obj2;
if (!obj->clip.clipees) return;
// schloooooooooooow:
@@ -157,10 +153,9 @@ evas_object_clip_across_clippees_check(Evas_Object
*eo_obj, Evas_Object_Protecte
evas_object_child_map_across_mark(eo_obj, obj, obj->map->cur.map_parent, 0);
if (obj->cur->cache.clip.dirty)
{
- EINA_LIST_FOREACH(obj->clip.clipees, l, eo_obj2)
+ EINA_LIST_FOREACH(obj->clip.clipees, l, obj2)
{
- Evas_Object_Protected_Data *obj2 = eo_data_get(eo_obj2,
EVAS_OBJ_CLASS);
- evas_object_clip_across_clippees_check(eo_obj2, obj2);
+ evas_object_clip_across_clippees_check(obj2->object, obj2);
}
}
#endif
@@ -265,7 +260,8 @@ _clip_set(Eo *eo_obj, void *_pd, va_list *list)
if (obj->cur->clipper)
{
/* unclip */
- obj->cur->clipper->clip.clipees =
eina_list_remove(obj->cur->clipper->clip.clipees, eo_obj);
+ obj->cur->clipper->clip.cache_clipees_answer =
eina_list_free(obj->cur->clipper->clip.cache_clipees_answer);
+ obj->cur->clipper->clip.clipees =
eina_list_remove(obj->cur->clipper->clip.clipees, obj);
if (!obj->cur->clipper->clip.clipees)
{
EINA_COW_STATE_WRITE_BEGIN(obj->cur->clipper, state_write, cur)
@@ -306,7 +302,8 @@ _clip_set(Eo *eo_obj, void *_pd, va_list *list)
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
- clip->clip.clipees = eina_list_append(clip->clip.clipees, eo_obj);
+ clip->clip.cache_clipees_answer =
eina_list_free(clip->clip.cache_clipees_answer);
+ clip->clip.clipees = eina_list_append(clip->clip.clipees, obj);
if (clip->clip.clipees)
{
EINA_COW_STATE_WRITE_BEGIN(clip, state_write, cur)
@@ -383,6 +380,9 @@ _clip_unset(Eo *eo_obj, void *_pd, va_list *list
EINA_UNUSED)
Evas_Object_Protected_Data *obj = _pd;
if (!obj->cur->clipper) return;
+
+ obj->clip.cache_clipees_answer =
eina_list_free(obj->clip.cache_clipees_answer);
+
/* unclip */
if (evas_object_intercept_call_clip_unset(eo_obj)) return;
if (obj->is_smart)
@@ -391,7 +391,7 @@ _clip_unset(Eo *eo_obj, void *_pd, va_list *list
EINA_UNUSED)
}
if (obj->cur->clipper)
{
- obj->cur->clipper->clip.clipees =
eina_list_remove(obj->cur->clipper->clip.clipees, eo_obj);
+ obj->cur->clipper->clip.clipees =
eina_list_remove(obj->cur->clipper->clip.clipees, obj);
if (!obj->cur->clipper->clip.clipees)
{
EINA_COW_STATE_WRITE_BEGIN(obj->cur->clipper, state_write, cur)
@@ -448,7 +448,34 @@ void
_clipees_get(Eo *eo_obj EINA_UNUSED, void *_pd, va_list *list)
{
const Eina_List **clipees = va_arg(*list, const Eina_List **);
- const Evas_Object_Protected_Data *obj = _pd;
- *clipees = obj->clip.clipees;
+ Evas_Object_Protected_Data *obj = _pd;
+ const Evas_Object_Protected_Data *tmp;
+ Eina_List *l;
+ Eina_List *answer = NULL;
+
+ obj->clip.cache_clipees_answer =
eina_list_free(obj->clip.cache_clipees_answer);
+
+ EINA_LIST_FOREACH(obj->clip.clipees, l, tmp)
+ answer = eina_list_append(answer, tmp);
+
+ *clipees = answer;
+ obj->clip.cache_clipees_answer = answer;
}
+EAPI Eina_Bool
+evas_object_clipees_has(const Evas_Object *eo_obj)
+{
+ Eina_Bool r;
+
+ eo_do((Eo *)eo_obj, evas_obj_clipees_has(&r));
+ return r;
+}
+
+void
+_clipees_has(Eo *eo_obj EINA_UNUSED, void *_pd, va_list *list)
+{
+ Eina_Bool *r = va_arg(*list, Eina_Bool *);
+ Evas_Object_Protected_Data *obj = _pd;
+
+ *r = obj->clip.clipees ? EINA_TRUE : EINA_FALSE;
+}
diff --git a/src/lib/evas/canvas/evas_object_main.c
b/src/lib/evas/canvas/evas_object_main.c
index fc2557b..ad75874 100644
--- a/src/lib/evas/canvas/evas_object_main.c
+++ b/src/lib/evas/canvas/evas_object_main.c
@@ -173,6 +173,7 @@ evas_object_free(Evas_Object *eo_obj, int clean_layer)
if (!was_smart_child) evas_object_release(eo_obj, obj, obj->clean_layer);
if (obj->clip.clipees)
eina_list_free(obj->clip.clipees);
+ obj->clip.cache_clipees_answer =
eina_list_free(obj->clip.cache_clipees_answer);
evas_object_clip_changes_clean(eo_obj);
evas_object_event_callback_all_del(eo_obj);
evas_object_event_callback_cleanup(eo_obj);
@@ -200,6 +201,7 @@ void
evas_object_change(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
{
Eina_List *l;
+ Evas_Object_Protected_Data *obj2;
Evas_Object *eo_obj2;
Eina_Bool movch = EINA_FALSE;
@@ -219,17 +221,16 @@ evas_object_change(Evas_Object *eo_obj,
Evas_Object_Protected_Data *obj)
/* set changed flag on all objects this one clips too */
if (!((movch) && (obj->is_static_clip)))
{
- EINA_LIST_FOREACH(obj->clip.clipees, l, eo_obj2)
+ EINA_LIST_FOREACH(obj->clip.clipees, l, obj2)
{
- Evas_Object_Protected_Data *obj2 = eo_data_get(eo_obj2, MY_CLASS);
- if (!obj2) continue;
- evas_object_change(eo_obj2, obj2);
+ evas_object_change(obj2->object, obj2);
}
}
EINA_LIST_FOREACH(obj->proxy->proxies, l, eo_obj2)
{
- Evas_Object_Protected_Data *obj2 = eo_data_get(eo_obj2, MY_CLASS);
- if (!obj2) continue;
+ obj2 = eo_data_get(eo_obj2, MY_CLASS);
+
+ if (!obj2) continue;
evas_object_change(eo_obj2, obj2);
}
if (obj->smart.parent)
@@ -605,6 +606,7 @@ _destructor(Eo *eo_obj, void *_pd, va_list *list
EINA_UNUSED)
return;
MAGIC_CHECK_END();
Evas_Object_Protected_Data *obj = _pd;
+ Evas_Object_Protected_Data *tmp;
evas_object_hide(eo_obj);
if (obj->focused)
@@ -635,8 +637,8 @@ _destructor(Eo *eo_obj, void *_pd, va_list *list
EINA_UNUSED)
goto end;
}
evas_object_grabs_cleanup(eo_obj, obj);
- while (obj->clip.clipees)
- evas_object_clip_unset(obj->clip.clipees->data);
+ EINA_LIST_FREE(obj->clip.clipees, tmp)
+ evas_object_clip_unset(tmp->object);
while (obj->proxy->proxies)
evas_object_image_source_unset(obj->proxy->proxies->data);
if (obj->cur->clipper) evas_object_clip_unset(eo_obj);
@@ -1904,9 +1906,9 @@ _dbg_info_get(Eo *eo_obj, void *_pd EINA_UNUSED, va_list
*list)
eo_do(eo_obj, evas_obj_propagate_events_get(&event));
EO_DBG_INFO_APPEND(group, "Propagate Events", EINA_VALUE_TYPE_CHAR, event);
- const Eina_List *clipees;
- eo_do(eo_obj, evas_obj_clipees_get(&clipees));
- EO_DBG_INFO_APPEND(group, "Has clipees", EINA_VALUE_TYPE_CHAR, (Eina_Bool)
(!!clipees));
+ const Eina_Bool clipees_has;
+ eo_do(eo_obj, evas_obj_clipees_has(&clipees_has));
+ EO_DBG_INFO_APPEND(group, "Has clipees", EINA_VALUE_TYPE_CHAR, clipees_has);
const Evas_Map *map = evas_object_map_get(eo_obj);
if (map)
@@ -2461,6 +2463,7 @@ _class_constructor(Eo_Class *klass)
EO_OP_FUNC(EVAS_OBJ_ID(EVAS_OBJ_SUB_ID_CLIP_GET), _clip_get),
EO_OP_FUNC(EVAS_OBJ_ID(EVAS_OBJ_SUB_ID_CLIP_UNSET), _clip_unset),
EO_OP_FUNC(EVAS_OBJ_ID(EVAS_OBJ_SUB_ID_CLIPEES_GET), _clipees_get),
+ EO_OP_FUNC(EVAS_OBJ_ID(EVAS_OBJ_SUB_ID_CLIPEES_HAS), _clipees_has),
EO_OP_FUNC(EVAS_OBJ_ID(EVAS_OBJ_SUB_ID_MAP_ENABLE_SET),
_map_enable_set),
EO_OP_FUNC(EVAS_OBJ_ID(EVAS_OBJ_SUB_ID_MAP_ENABLE_GET),
_map_enable_get),
EO_OP_FUNC(EVAS_OBJ_ID(EVAS_OBJ_SUB_ID_MAP_SET), _map_set),
@@ -2543,6 +2546,7 @@ static const Eo_Op_Description op_desc[] = {
EO_OP_DESCRIPTION(EVAS_OBJ_SUB_ID_CLIP_GET, "Get the object clipping obj
(if any)."),
EO_OP_DESCRIPTION(EVAS_OBJ_SUB_ID_CLIP_UNSET, "Disable/cease clipping on
a clipped obj object."),
EO_OP_DESCRIPTION(EVAS_OBJ_SUB_ID_CLIPEES_GET, "Return a list of objects
currently clipped by obj."),
+ EO_OP_DESCRIPTION(EVAS_OBJ_SUB_ID_CLIPEES_HAS, "Return EINA_TRUE if there
is any object is clipped by obj."),
EO_OP_DESCRIPTION(EVAS_OBJ_SUB_ID_MAP_ENABLE_SET, "Enable or disable the
map that is set."),
EO_OP_DESCRIPTION(EVAS_OBJ_SUB_ID_MAP_ENABLE_GET, "Get the map enabled
state"),
EO_OP_DESCRIPTION(EVAS_OBJ_SUB_ID_MAP_SET, "Set current object
transformation map."),
diff --git a/src/lib/evas/canvas/evas_object_smart_clipped.c
b/src/lib/evas/canvas/evas_object_smart_clipped.c
index 3c1c29c..888a0b8 100644
--- a/src/lib/evas/canvas/evas_object_smart_clipped.c
+++ b/src/lib/evas/canvas/evas_object_smart_clipped.c
@@ -144,7 +144,7 @@ static void
evas_object_smart_clipped_smart_show(Evas_Object *eo_obj)
{
CSO_DATA_GET_OR_RETURN(eo_obj, cso);
- if (evas_object_clipees_get(cso->clipper))
+ if (evas_object_clipees_has(cso->clipper))
evas_object_show(cso->clipper); /* just show if clipper being used */
}
diff --git a/src/lib/evas/include/evas_private.h
b/src/lib/evas/include/evas_private.h
index 76dfecc..2ba2033 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -584,6 +584,7 @@ struct _Evas_Object_Protected_Data
struct {
Eina_List *clipees;
+ Eina_List *cache_clipees_answer;
Eina_List *changes;
} clip;
@@ -1107,6 +1108,7 @@ void _clip_set(Eo *obj, void *_pd, va_list *list);
void _clip_get(Eo *obj, void *_pd, va_list *list);
void _clip_unset(Eo *obj, void *_pd, va_list *list);
void _clipees_get(Eo *obj, void *_pd, va_list *list);
+void _clipees_has(Eo *obj, void *_pd, va_list *list);
void _map_enable_set(Eo *obj, void *_pd, va_list *list);
void _map_enable_get(Eo *obj, void *_pd, va_list *list);
void _map_source_set(Eo *obj, void *_pd, va_list *list);
--
------------------------------------------------------------------------------
Precog is a next-generation analytics platform capable of advanced
analytics on semi-structured data. The platform includes APIs for building
apps and a phenomenal toolset for data science. Developers can use
our toolset for easy data analysis & visualization. Get a free account!
http://www2.precog.com/precogplatform/slashdotnewsletter