Evas masking: Try to reduce memory footprint a little
authorJean-Philippe Andre <jp.andre@samsung.com>
Wed, 21 Jan 2015 06:14:50 +0000 (15:14 +0900)
committerJean-Philippe Andre <jp.andre@samsung.com>
Wed, 21 Jan 2015 08:38:22 +0000 (17:38 +0900)
Move some mask object pointers around to spare a few
bytes of memory.

Fixes T2025.

src/lib/evas/canvas/evas_object_main.c
src/lib/evas/canvas/evas_render.c
src/lib/evas/include/evas_inline.x
src/lib/evas/include/evas_private.h

index 7c2ea94..65ed189 100644 (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
 };
index 47f26cd..18560bf 100644 (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)
                               {
index 0a86e9b..cfd3182 100644 (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);
 }
index 7e082a6..318baf2 100644 (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;