Evas masking: Try to reduce memory footprint a little

Move some mask object pointers around to spare a few
bytes of memory.

Fixes T2025.
This commit is contained in:
Jean-Philippe Andre 2015-01-21 15:14:50 +09:00
parent 30a2311879
commit 0793dee86a
4 changed files with 17 additions and 22 deletions

View File

@ -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
};

View File

@ -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)
{

View File

@ -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);
}

View File

@ -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;