jpeg pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=0793dee86ae9f80f63f70b170c3f5ec15946824f
commit 0793dee86ae9f80f63f70b170c3f5ec15946824f Author: Jean-Philippe Andre <jp.an...@samsung.com> Date: Wed Jan 21 15:14:50 2015 +0900 Evas masking: Try to reduce memory footprint a little Move some mask object pointers around to spare a few bytes of memory. Fixes T2025. --- src/lib/evas/canvas/evas_object_main.c | 2 +- src/lib/evas/canvas/evas_render.c | 11 +++++------ src/lib/evas/include/evas_inline.x | 23 ++++++++++------------- src/lib/evas/include/evas_private.h | 3 +-- 4 files changed, 17 insertions(+), 22 deletions(-) diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c index 7c2ea94..65ed189 100644 --- a/src/lib/evas/canvas/evas_object_main.c +++ b/src/lib/evas/canvas/evas_object_main.c @@ -28,7 +28,7 @@ static const Evas_Object_Map_Data default_map = { }; static const Evas_Object_Protected_State default_state = { NULL, { 0, 0, 0, 0 }, - { { NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, EINA_FALSE, EINA_FALSE } }, + { { 0, 0, 0, 0, 0, 0, 0, 0, EINA_FALSE, EINA_FALSE } }, { 255, 255, 255, 255 }, 1.0, 0, EVAS_RENDER_BLEND, EINA_FALSE, EINA_FALSE, EINA_FALSE, EINA_FALSE, EINA_FALSE, EINA_FALSE }; diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index 47f26cd..18560bf 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -1534,8 +1534,7 @@ evas_render_mapped(Evas_Public_Data *e, Evas_Object *eo_obj, if (_evas_render_object_is_mask(obj->cur->clipper)) { // This path can be hit when we're multiplying masks on top of each other... - Evas_Object_Protected_Data *mask = - (Evas_Object_Protected_Data *) obj->cur->clipper; + Evas_Object_Protected_Data *mask = obj->cur->clipper; if (mask->mask->redraw || !mask->mask->surface) evas_render_mask_subrender(obj->layer->evas, mask, NULL); @@ -2287,10 +2286,10 @@ evas_render_updates_internal(Evas *eo_e, /* Clipper masks */ if (_evas_render_object_is_mask(obj->cur->clipper)) - mask = (Evas_Object_Protected_Data *) obj->cur->clipper; // main object clipped by this mask - else if (obj->cur->cache.clip.mask) - mask = (Evas_Object_Protected_Data *) obj->cur->cache.clip.mask; // propagated clip - prev_mask = (Evas_Object_Protected_Data *) obj->cur->cache.clip.prev_mask; + mask = obj->cur->clipper; // main object clipped by this mask + else if (obj->clip.mask) + mask = obj->clip.mask; // propagated clip + prev_mask = obj->clip.prev_mask; if (mask) { diff --git a/src/lib/evas/include/evas_inline.x b/src/lib/evas/include/evas_inline.x index 0a86e9b..cfd3182 100644 --- a/src/lib/evas/include/evas_inline.x +++ b/src/lib/evas/include/evas_inline.x @@ -72,7 +72,7 @@ evas_object_is_opaque(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj) { /* If has mask image: Always assume non opaque */ if ((obj->cur->clipper && obj->cur->clipper->mask->is_mask) || - (obj->cur->cache.clip.mask)) + (obj->clip.mask)) return 0; if (obj->func->is_opaque) return obj->func->is_opaque(eo_obj, obj, obj->private_data); @@ -246,7 +246,6 @@ evas_object_clip_recalc(Evas_Object_Protected_Data *obj) Evas_Object_Protected_Data *clipper = NULL; int cx, cy, cw, ch, cr, cg, cb, ca; int nx, ny, nw, nh, nr, ng, nb, na; - const Evas_Object_Protected_Data *mask = NULL, *prev_mask = NULL; Eina_Bool cvis, nvis; Evas_Object *eo_obj; @@ -300,28 +299,30 @@ evas_object_clip_recalc(Evas_Object_Protected_Data *obj) RECTS_CLIP_TO_RECT(cx, cy, cw, ch, nx, ny, nw, nh); } + obj->clip.prev_mask = NULL; if (clipper->mask->is_mask) { // Set complex masks the object being clipped (parent) - mask = clipper; + obj->clip.mask = clipper; // Forward any mask from the parents if (EINA_LIKELY(obj->smart.parent != NULL)) { Evas_Object_Protected_Data *parent = eo_data_scope_get(obj->smart.parent, EVAS_OBJECT_CLASS); - if (parent->cur->cache.clip.mask) + if (parent->clip.mask) { - if (parent->cur->cache.clip.mask != mask) - prev_mask = parent->cur->cache.clip.mask; + if (parent->clip.mask != obj->clip.mask) + obj->clip.prev_mask = parent->clip.mask; } } } - else if (clipper->cur->cache.clip.mask) + else if (clipper->clip.mask) { // Pass complex masks to children - mask = clipper->cur->cache.clip.mask; + obj->clip.mask = clipper->clip.mask; } + else obj->clip.mask = NULL; nvis = clipper->cur->cache.clip.visible; nr = clipper->cur->cache.clip.r; @@ -347,9 +348,7 @@ evas_object_clip_recalc(Evas_Object_Protected_Data *obj) obj->cur->cache.clip.g == cg && obj->cur->cache.clip.b == cb && obj->cur->cache.clip.a == ca && - obj->cur->cache.clip.dirty == EINA_FALSE && - obj->cur->cache.clip.mask == mask && - obj->cur->cache.clip.prev_mask == prev_mask) + obj->cur->cache.clip.dirty == EINA_FALSE) return ; EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur) @@ -364,8 +363,6 @@ evas_object_clip_recalc(Evas_Object_Protected_Data *obj) state_write->cache.clip.b = cb; state_write->cache.clip.a = ca; state_write->cache.clip.dirty = EINA_FALSE; - state_write->cache.clip.mask = mask; - state_write->cache.clip.prev_mask = prev_mask; } EINA_COW_STATE_WRITE_END(obj, state_write, cur); } diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index 7e082a6..318baf2 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -908,8 +908,6 @@ struct _Evas_Object_Protected_State Evas_Coord_Rectangle geometry; struct { struct { - const Evas_Object_Protected_Data *mask, *prev_mask; - Evas_Coord x, y, w, h; unsigned char r, g, b, a; Eina_Bool visible : 1; @@ -956,6 +954,7 @@ struct _Evas_Object_Protected_Data Eina_List *clipees; Eina_List *cache_clipees_answer; Eina_List *changes; + Evas_Object_Protected_Data *mask, *prev_mask; } clip; const Evas_Object_Func *func; --