From 0d555dda7f2f8cb86d097ca713aa5ca61aac4ff7 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Andre Date: Mon, 20 Feb 2017 19:34:58 +0900 Subject: [PATCH] evas: Optimize out some calls to data_scope_get Within evas when we know an object is marked as is_smart, then we know it's a smart object. :) @optimize --- src/lib/evas/canvas/evas_events.c | 12 ++++---- src/lib/evas/canvas/evas_object_main.c | 4 +-- src/lib/evas/canvas/evas_object_smart.c | 41 +++++++++---------------- src/lib/evas/canvas/evas_render.c | 4 +-- src/lib/evas/include/evas_private.h | 6 ++-- 5 files changed, 28 insertions(+), 39 deletions(-) diff --git a/src/lib/evas/canvas/evas_events.c b/src/lib/evas/canvas/evas_events.c index aa0c9e7c0c..a53bb12d85 100644 --- a/src/lib/evas/canvas/evas_events.c +++ b/src/lib/evas/canvas/evas_events.c @@ -146,8 +146,8 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in, { Evas_Coord_Rectangle bounding_box = { 0, 0, 0, 0 }; - evas_object_smart_bounding_box_update(eo_obj, obj); - evas_object_smart_bounding_box_get(obj->object, &bounding_box, NULL); + evas_object_smart_bounding_box_update(obj); + evas_object_smart_bounding_box_get(obj, &bounding_box, NULL); c = bounding_box; } else @@ -164,7 +164,7 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in, { Evas_Coord_Rectangle bounding_box = { 0, 0, 0, 0 }; - evas_object_smart_bounding_box_get(obj->object, &bounding_box, NULL); + evas_object_smart_bounding_box_get(obj, &bounding_box, NULL); DDD("___ %p g[%6i %6i %6ix%6i] c[%6i %6i %6ix%6i] b[%6i %6i %6ix%6i] %s\n", obj->object, obj->cur->geometry.x, obj->cur->geometry.y, @@ -200,7 +200,7 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in, { Evas_Coord_Rectangle bounding_box = { 0, 0, 0, 0 }; - evas_object_smart_bounding_box_get(obj->object, &bounding_box, NULL); + evas_object_smart_bounding_box_get(obj, &bounding_box, NULL); DDD("OBJ %p g[%6i %6i %6ix%6i] c[%6i %6i %6ix%6i] b[%6i %6i %6ix%6i] %s\n", obj->object, obj->cur->geometry.x, obj->cur->geometry.y, @@ -277,9 +277,9 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in, Evas_Coord_Rectangle bounding_box = { 0, 0, 0, 0 }; if (!obj->child_has_map) - evas_object_smart_bounding_box_update(eo_obj, obj); + evas_object_smart_bounding_box_update(obj); - evas_object_smart_bounding_box_get(eo_obj, &bounding_box, NULL); + evas_object_smart_bounding_box_get(obj, &bounding_box, NULL); if (obj->child_has_map || (bounding_box.x <= x && diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c index a95db83b0a..293d71c6fc 100644 --- a/src/lib/evas/canvas/evas_object_main.c +++ b/src/lib/evas/canvas/evas_object_main.c @@ -244,8 +244,8 @@ evas_object_clip_recalc(Evas_Object_Protected_Data *obj) { Evas_Coord_Rectangle bounding_box; - evas_object_smart_bounding_box_update(eo_obj, obj); - evas_object_smart_bounding_box_get(eo_obj, &bounding_box, NULL); + evas_object_smart_bounding_box_update(obj); + evas_object_smart_bounding_box_get(obj, &bounding_box, NULL); cx = bounding_box.x; cy = bounding_box.y; cw = bounding_box.w; diff --git a/src/lib/evas/canvas/evas_object_smart.c b/src/lib/evas/canvas/evas_object_smart.c index ca95b6e83a..870955ba4e 100644 --- a/src/lib/evas/canvas/evas_object_smart.c +++ b/src/lib/evas/canvas/evas_object_smart.c @@ -1118,7 +1118,7 @@ evas_object_smart_del(Evas_Object *eo_obj) } void -evas_object_update_bounding_box(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, Evas_Smart_Data *s) +evas_object_update_bounding_box(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj, Evas_Smart_Data *s) { Eina_Bool propagate = EINA_FALSE; Eina_Bool computeminmax = EINA_FALSE; @@ -1135,7 +1135,7 @@ evas_object_update_bounding_box(Evas_Object *eo_obj, Evas_Object_Protected_Data if (obj->is_smart) { - s = s == NULL ? efl_data_scope_get(eo_obj, MY_CLASS) : s; + if (!s) s = obj->private_data; x = s->cur.bounding_box.x; y = s->cur.bounding_box.y; @@ -1226,8 +1226,7 @@ evas_object_update_bounding_box(Evas_Object *eo_obj, Evas_Object_Protected_Data if (computeminmax) { - evas_object_smart_need_bounding_box_update(obj->smart.parent, - obj->smart.parent_data, + evas_object_smart_need_bounding_box_update(obj->smart.parent_data, obj->smart.parent_object_data); } } @@ -1253,11 +1252,11 @@ evas_object_update_bounding_box(Evas_Object *eo_obj, Evas_Object_Protected_Data } void -evas_object_smart_bounding_box_get(Evas_Object *eo_obj, +evas_object_smart_bounding_box_get(Evas_Object_Protected_Data *obj, Evas_Coord_Rectangle *cur_bounding_box, Evas_Coord_Rectangle *prev_bounding_box) { - Evas_Smart_Data *s = efl_data_scope_get(eo_obj, MY_CLASS); + Evas_Smart_Data *s = obj->private_data; if (cur_bounding_box) memcpy(cur_bounding_box, &s->cur.bounding_box, @@ -1416,29 +1415,24 @@ evas_object_smart_member_stack_below(Evas_Object *eo_member, Evas_Object *eo_oth } void -evas_object_smart_need_bounding_box_update(Evas_Object *eo_obj, Evas_Smart_Data *o, Evas_Object_Protected_Data *obj) +evas_object_smart_need_bounding_box_update(Evas_Smart_Data *o, Evas_Object_Protected_Data *obj) { - MAGIC_CHECK(eo_obj, Evas_Object, MAGIC_OBJ); - return; - MAGIC_CHECK_END(); - - evas_object_async_block(obj); if (o->update_boundingbox_needed) return; o->update_boundingbox_needed = EINA_TRUE; - EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur) + if (!obj->cur->cache.clip.dirty) { - state_write->cache.clip.dirty = EINA_TRUE; + EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur) + state_write->cache.clip.dirty = EINA_TRUE; + EINA_COW_STATE_WRITE_END(obj, state_write, cur); } - EINA_COW_STATE_WRITE_END(obj, state_write, cur); if (obj->smart.parent) - evas_object_smart_need_bounding_box_update(obj->smart.parent, - obj->smart.parent_data, + evas_object_smart_need_bounding_box_update(obj->smart.parent_data, obj->smart.parent_object_data); } void -evas_object_smart_bounding_box_update(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj) +evas_object_smart_bounding_box_update(Evas_Object_Protected_Data *obj) { Evas_Smart_Data *os; Eina_Inlist *list; @@ -1450,12 +1444,7 @@ evas_object_smart_bounding_box_update(Evas_Object *eo_obj, Evas_Object_Protected Evas_Coord tx1, ty1, tx2, ty2; Eina_Bool none = EINA_TRUE; - MAGIC_CHECK(eo_obj, Evas_Object, MAGIC_OBJ); - return; - MAGIC_CHECK_END(); - - evas_object_async_block(obj); - os = efl_data_scope_get(eo_obj, MY_CLASS); + os = obj->private_data; if (!os->update_boundingbox_needed) return; os->update_boundingbox_needed = EINA_FALSE; @@ -1471,9 +1460,9 @@ evas_object_smart_bounding_box_update(Evas_Object *eo_obj, Evas_Object_Protected if (o->is_smart) { - Evas_Smart_Data *s = efl_data_scope_get(o->object, MY_CLASS); + Evas_Smart_Data *s = o->private_data; - evas_object_smart_bounding_box_update(o->object, o); + evas_object_smart_bounding_box_update(o); tx1 = s->cur.bounding_box.x; ty1 = s->cur.bounding_box.y; diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index df7e8fc3c0..54690dc3c9 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -1073,7 +1073,7 @@ _evas_render_phase1_object_process(Phase1_Context *p1ctx, #ifdef INLINE_ACTIVE_GEOM if (obj->is_smart) - evas_object_smart_bounding_box_get(eo_obj, &(ent.rect), NULL); + evas_object_smart_bounding_box_get(obj, &(ent.rect), NULL); else { ent.rect.x = obj->cur->cache.clip.x; @@ -2716,7 +2716,7 @@ _is_obj_in_rect(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, { Evas_Coord_Rectangle rect; - evas_object_smart_bounding_box_get(eo_obj, &rect, NULL); + evas_object_smart_bounding_box_get(obj, &rect, NULL); if (RECTS_INTERSECT(x, y, w, h, rect.x, rect.y, rect.w, rect.h)) return EINA_TRUE; } diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index 8b448124b9..dbdff9e4ff 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -1664,7 +1664,7 @@ void _evas_object_image_video_overlay_show(Evas_Object *obj); void _evas_object_image_video_overlay_hide(Evas_Object *obj); void _evas_object_image_video_overlay_do(Evas_Object *obj); void _evas_object_image_free(Evas_Object *obj); -void evas_object_smart_bounding_box_get(Evas_Object *eo_obj, +void evas_object_smart_bounding_box_get(Evas_Object_Protected_Data *obj, Evas_Coord_Rectangle *cur_bounding_box, Evas_Coord_Rectangle *prev_bounding_box); void evas_object_smart_del(Evas_Object *obj); @@ -1681,8 +1681,8 @@ const Eina_Inlist *evas_object_smart_members_get_direct(const Evas_Object *obj); void _efl_canvas_group_group_members_all_del(Evas_Object *eo_obj); void _evas_object_smart_clipped_smart_move_internal(Evas_Object *eo_obj, Evas_Coord x, Evas_Coord y); void evas_call_smarts_calculate(Evas *e); -void evas_object_smart_bounding_box_update(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj); -void evas_object_smart_need_bounding_box_update(Evas_Object *eo_obj, Evas_Smart_Data *o, Evas_Object_Protected_Data *obj); +void evas_object_smart_bounding_box_update(Evas_Object_Protected_Data *obj); +void evas_object_smart_need_bounding_box_update(Evas_Smart_Data *o, Evas_Object_Protected_Data *obj); Eina_Bool evas_object_smart_changed_get(Evas_Object *eo_obj); void evas_object_smart_attach(Evas_Object *eo_obj, Evas_Smart *s); void *evas_mem_calloc(int size);