raster pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=cfa8224140de350e24370ca4d39f5691af8555d7

commit cfa8224140de350e24370ca4d39f5691af8555d7
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Tue Aug 20 09:43:52 2019 +0100

    edje recalc - move rare recalc code out of hot path
    
    we rarely use tables in edje, so move it out of the hot path for
    intruction prefetch/cache. also for calc single - move things to sub
    funcs so things like mesh, light and so on code is always out of the
    hot path as much as possible. we probably can merge our 2 switch
    statements as well. this really just restructures the code to move
    stuff into sub functions which also does make the calc funcs look
    simpler and easier to read.
---
 src/lib/edje/edje_calc.c | 549 ++++++++++++++++++++++++++---------------------
 1 file changed, 306 insertions(+), 243 deletions(-)

diff --git a/src/lib/edje/edje_calc.c b/src/lib/edje/edje_calc.c
index f3d31c8502..3dcdc73426 100644
--- a/src/lib/edje/edje_calc.c
+++ b/src/lib/edje/edje_calc.c
@@ -960,6 +960,46 @@ _edje_recalc(Edje *ed)
 //   ed->postponed = EINA_TRUE;
 }
 
+static
+#ifdef EDJE_CALC_CACHE
+Eina_Bool
+#else
+void
+#endif
+_edje_recalc_table_parts(Edje *ed
+#ifdef EDJE_CALC_CACHE
+                         , Eina_Bool need_reinit_state
+#endif
+                        )
+{
+   unsigned short i;
+   Edje_Real_Part *ep;
+
+   for (i = 0; i < ed->table_parts_size; i++)
+     {
+        ep = ed->table_parts[i];
+        ep->calculated = FLAG_NONE; // FIXME: this is dubious (see below)
+        ep->calculating = FLAG_NONE;
+#ifdef EDJE_CALC_CACHE
+        if (need_reinit_state)
+          {
+             ep->state = 0;
+             ep->param1.state = 0;
+             if (ep->param2) ep->param2->state = 0;
+          }
+#endif
+     }
+   for (i = 0; i < ed->table_parts_size; i++)
+     {
+        ep = ed->table_parts[i];
+        if (ep->calculated != FLAG_XY) // FIXME: this is always true (see for 
above)
+          _edje_part_recalc(ed, ep, (~ep->calculated) & FLAG_XY, NULL);
+     }
+#ifdef EDJE_CALC_CACHE
+   return need_reinit_state;
+#endif
+}
+
 void
 _edje_recalc_do(Edje *ed)
 {
@@ -986,31 +1026,16 @@ _edje_recalc_do(Edje *ed)
 #endif
      }
 
-   for (i = 0; i < ed->table_parts_size; i++)
-     {
-        Edje_Real_Part *ep;
-
-        ep = ed->table_parts[i];
-        ep->calculated = FLAG_NONE; // FIXME: this is dubious (see below)
-        ep->calculating = FLAG_NONE;
+   if (EINA_UNLIKELY(ed->table_parts_size > 0))
 #ifdef EDJE_CALC_CACHE
-        if (need_reinit_state)
-          {
-             ep->state = 0;
-             ep->param1.state = 0;
-             if (ep->param2)
-               ep->param2->state = 0;
-          }
+     need_reinit_state =
 #endif
-     }
-   for (i = 0; i < ed->table_parts_size; i++)
-     {
-        Edje_Real_Part *ep;
+       _edje_recalc_table_parts(ed
+#ifdef EDJE_CALC_CACHE
+                                , need_reinit_state
+#endif
+                               );
 
-        ep = ed->table_parts[i];
-        if (ep->calculated != FLAG_XY) // FIXME: this is always true (see for 
above)
-          _edje_part_recalc(ed, ep, (~ep->calculated) & FLAG_XY, NULL);
-     }
    if (!ed->calc_only) ed->recalc = EINA_FALSE;
 #ifdef EDJE_CALC_CACHE
    ed->all_part_change = EINA_FALSE;
@@ -2690,6 +2715,220 @@ _edje_part_recalc_single_filter(Edje *ed,
      }
 }
 
+static void
+_edje_part_recalc_single_table(Edje_Real_Part *ep,
+                               Edje_Part_Description_Common *chosen_desc,
+                               int *minw, int *minh)
+{
+   Eina_Size2D lmin;
+
+   efl_canvas_group_need_recalculate_set(ep->object, 1);
+   efl_canvas_group_calculate(ep->object);
+   lmin = efl_gfx_hint_size_restricted_min_get(ep->object);
+   if (((Edje_Part_Description_Table *)chosen_desc)->table.min.h)
+     {
+        if (lmin.w > *minw) *minw = lmin.w;
+     }
+   if (((Edje_Part_Description_Table *)chosen_desc)->table.min.v)
+     {
+        if (lmin.h > *minh) *minh = lmin.h;
+     }
+}
+
+static void
+_edje_part_recalc_single_box(Edje_Real_Part *ep,
+                             Edje_Part_Description_Common *chosen_desc,
+                             int *minw, int *minh)
+{
+   Eina_Size2D lmin;
+
+   efl_canvas_group_need_recalculate_set(ep->object, 1);
+   efl_canvas_group_calculate(ep->object);
+   lmin = efl_gfx_hint_size_restricted_min_get(ep->object);
+   if (((Edje_Part_Description_Box *)chosen_desc)->box.min.h)
+     {
+        if (lmin.w > *minw) *minw = lmin.w;
+     }
+   if (((Edje_Part_Description_Box *)chosen_desc)->box.min.v)
+     {
+        if (lmin.h > *minh) *minh = lmin.h;
+     }
+}
+
+static void
+_edje_part_recalc_single_image(Edje *ed, Edje_Real_Part *ep,
+                               Edje_Part_Description_Common *chosen_desc,
+                               FLOAT_T pos,
+                               int *minw, int *minh, int *maxw, int *maxh)
+{
+   Evas_Coord w, h;
+
+   /* We only need pos to find the right image that would be displayed */
+   /* Yes, if someone set aspect preference to SOURCE and also max,min
+    to SOURCE, it will be under efficient, but who cares at the
+    moment. */
+   _edje_real_part_image_set(ed, ep, NULL, pos);
+   evas_object_image_size_get(ep->object, &w, &h);
+   if (chosen_desc->min.limit)
+     {
+        if (w > *minw) *minw = w;
+        if (h > *minh) *minh = h;
+     }
+   if (chosen_desc->max.limit)
+     {
+        if ((*maxw <= 0) || (w < *maxw)) *maxw = w;
+        if ((*maxh <= 0) || (h < *maxh)) *maxh = h;
+     }
+}
+
+#ifdef HAVE_EPHYSICS
+static void
+_edje_part_recalc_single_physics(Edje_Calc_Params *params,
+                                 Edje_Part_Description_Common *desc)
+{
+   EINA_COW_CALC_PHYSICS_BEGIN(params, params_write)
+     {
+        params_write->mass = desc->physics.mass;
+        params_write->restitution = desc->physics.restitution;
+        params_write->friction = desc->physics.friction;
+        params_write->damping.linear = desc->physics.damping.linear;
+        params_write->damping.angular = desc->physics.damping.angular;
+        params_write->sleep.linear = desc->physics.sleep.linear;
+        params_write->sleep.angular = desc->physics.sleep.angular;
+        params_write->material = desc->physics.material;
+        params_write->density = desc->physics.density;
+        params_write->hardness = desc->physics.hardness;
+        params_write->ignore_part_pos = desc->physics.ignore_part_pos;
+        params_write->light_on = desc->physics.light_on;
+        params_write->mov_freedom.lin.x = desc->physics.mov_freedom.lin.x;
+        params_write->mov_freedom.lin.y = desc->physics.mov_freedom.lin.y;
+        params_write->mov_freedom.lin.z = desc->physics.mov_freedom.lin.z;
+        params_write->mov_freedom.ang.x = desc->physics.mov_freedom.ang.x;
+        params_write->mov_freedom.ang.y = desc->physics.mov_freedom.ang.y;
+        params_write->mov_freedom.ang.z = desc->physics.mov_freedom.ang.z;
+        params_write->backcull = desc->physics.backcull;
+        params_write->z = desc->physics.z;
+        params_write->depth = desc->physics.depth;
+     }
+   EINA_COW_CALC_PHYSICS_END(params, params_write);
+}
+#endif
+
+static void
+_edje_part_calc_single_fixed_info(Edje *ed, Edje_Real_Part *ep,
+                                  Eina_Bool fixedw, Eina_Bool fixedh)
+{
+   INF("file %s, group %s has a non-fixed part '%s'. You should add "
+       "'fixed: %d %d'. But in order to optimize the edje calc, we "
+       "add it automatically.", ed->path, ed->group, ep->part->name,
+       fixedw, fixedh);
+}
+
+static void
+_edje_part_calc_single_image0(Edje *ed, Edje_Real_Part *ep,
+                              Edje_Calc_Params *params,
+                              Edje_Part_Description_Image *img_desc,
+                              FLOAT_T pos)
+{
+   Edje_Real_Part_Set *set;
+
+   _edje_real_part_image_set(ed, ep, &set, pos);
+
+   /* border */
+   _edje_calc_params_need_type_common(params);
+   params->type.common->spec.image.l = img_desc->image.border.l;
+   params->type.common->spec.image.r = img_desc->image.border.r;
+   params->type.common->spec.image.t = img_desc->image.border.t;
+   params->type.common->spec.image.b = img_desc->image.border.b;
+
+   params->type.common->spec.image.border_scale_by = 
img_desc->image.border.scale_by;
+
+   if (set && set->set)
+     {
+#define SET_BORDER_DEFINED(Result, Value) Result = Value ? Value : Result;
+        SET_BORDER_DEFINED(params->type.common->spec.image.l, 
set->entry->border.l);
+        SET_BORDER_DEFINED(params->type.common->spec.image.r, 
set->entry->border.r);
+        SET_BORDER_DEFINED(params->type.common->spec.image.t, 
set->entry->border.t);
+        SET_BORDER_DEFINED(params->type.common->spec.image.b, 
set->entry->border.b);
+
+        params->type.common->spec.image.border_scale_by = 
NEQ(set->entry->border.scale_by, ZERO) ?
+          set->entry->border.scale_by : 
params->type.common->spec.image.border_scale_by;
+     }
+}
+
+static void
+_edje_part_calc_single_text0(Edje_Calc_Params *params,
+                             Edje_Part_Description_Text *text_desc,
+                             Edje_Color_Class *cc)
+{
+   _edje_calc_params_need_type_text(params);
+   /* text.align */
+   params->type.text->align.x = text_desc->text.align.x;
+   params->type.text->align.y = text_desc->text.align.y;
+   params->type.text->ellipsis = text_desc->text.ellipsis;
+
+   /* text colors */
+   if (cc)
+     {
+        params->type.text->color2.r = (((int)cc->r2 + 1) * 
text_desc->common.color2.r) >> 8;
+        params->type.text->color2.g = (((int)cc->g2 + 1) * 
text_desc->common.color2.g) >> 8;
+        params->type.text->color2.b = (((int)cc->b2 + 1) * 
text_desc->common.color2.b) >> 8;
+        params->type.text->color2.a = (((int)cc->a2 + 1) * 
text_desc->common.color2.a) >> 8;
+        params->type.text->color3.r = (((int)cc->r3 + 1) * 
text_desc->text.color3.r) >> 8;
+        params->type.text->color3.g = (((int)cc->g3 + 1) * 
text_desc->text.color3.g) >> 8;
+        params->type.text->color3.b = (((int)cc->b3 + 1) * 
text_desc->text.color3.b) >> 8;
+        params->type.text->color3.a = (((int)cc->a3 + 1) * 
text_desc->text.color3.a) >> 8;
+     }
+   else
+     {
+        params->type.text->color2.r = text_desc->common.color2.r;
+        params->type.text->color2.g = text_desc->common.color2.g;
+        params->type.text->color2.b = text_desc->common.color2.b;
+        params->type.text->color2.a = text_desc->common.color2.a;
+        params->type.text->color3.r = text_desc->text.color3.r;
+        params->type.text->color3.g = text_desc->text.color3.g;
+        params->type.text->color3.b = text_desc->text.color3.b;
+        params->type.text->color3.a = text_desc->text.color3.a;
+     }
+}
+
+static void
+_edje_part_calc_single_light0(Edje_Calc_Params *params,
+                             Edje_Part_Description_Light *light_desc)
+{
+   _edje_calc_params_need_type_node(params);
+   params->type.node->data[0] = light_desc->light.orientation.data[0];
+   params->type.node->point.x = light_desc->light.position.point.x;
+   params->type.node->point.y = light_desc->light.position.point.y;
+   params->type.node->point.z = light_desc->light.position.point.z;
+}
+
+static void
+_edje_part_calc_single_camera0(Edje_Calc_Params *params,
+                               Edje_Part_Description_Camera *camera_desc)
+{
+   _edje_calc_params_need_type_node(params);
+   params->type.node->data[0] = camera_desc->camera.orientation.data[0];
+   params->type.node->point.x = camera_desc->camera.position.point.x;
+   params->type.node->point.y = camera_desc->camera.position.point.y;
+   params->type.node->point.z = camera_desc->camera.position.point.z;
+}
+
+static void
+_edje_part_calc_single_mesh0(Edje_Calc_Params *params,
+                             Edje_Part_Description_Mesh_Node *mesh_desc)
+{
+   _edje_calc_params_need_type_node(params);
+   params->type.node->frame = mesh_desc->mesh_node.mesh.frame;
+   params->type.node->data[0] = mesh_desc->mesh_node.orientation.data[0];
+   params->type.node->point.x = mesh_desc->mesh_node.position.point.x;
+   params->type.node->point.y = mesh_desc->mesh_node.position.point.y;
+   params->type.node->point.z = mesh_desc->mesh_node.position.point.z;
+   params->type.node->scale_3d.x = mesh_desc->mesh_node.scale_3d.x;
+   params->type.node->scale_3d.y = mesh_desc->mesh_node.scale_3d.y;
+   params->type.node->scale_3d.z = mesh_desc->mesh_node.scale_3d.z;
+}
+
 static void
 _edje_part_recalc_single(Edje *ed,
                          Edje_Real_Part *ep,
@@ -2739,7 +2978,6 @@ _edje_part_recalc_single(Edje *ed,
         chosen_desc->fixed.w = 1;
         fixedw = EINA_TRUE;
      }
-
    if ((rel1_to_y == rel2_to_y) &&
        (EQ(desc->rel1.relative_y, desc->rel2.relative_y)) &&
        (!chosen_desc->fixed.h))
@@ -2748,19 +2986,13 @@ _edje_part_recalc_single(Edje *ed,
         fixedh = EINA_TRUE;
      }
    if (fixedw || fixedh)
-     {
-        INF("file %s, group %s has a non-fixed part '%s'. You should add "
-            "'fixed: %d %d'. But in order to optimize the edje calc, we "
-            "add it automatically.", ed->path, ed->group, ep->part->name,
-            fixedw, fixedh);
-     }
+     _edje_part_calc_single_fixed_info(ed, ep, fixedw, fixedh);
 
    /* colors */
    if (ep->part->type != EDJE_PART_TYPE_SPACER)
      {
         if ((desc->color_class) && (*desc->color_class))
           cc = _edje_color_class_recursive_find(ed, desc->color_class);
-
         if (cc)
           {
              params->color.r = (((int)cc->r + 1) * desc->color.r) >> 8;
@@ -2799,79 +3031,16 @@ _edje_part_recalc_single(Edje *ed,
         params->ext->clip_to = clip_to;
      }
 
-   /* set parameters, some are required for recalc_single_text[block] */
+   // set parameters, some are required for recalc_single_text[block]
    switch (ep->part->type)
      {
       case EDJE_PART_TYPE_IMAGE:
-      {
-         Edje_Real_Part_Set *set;
-         Edje_Part_Description_Image *img_desc = (Edje_Part_Description_Image 
*)desc;
-
-         _edje_real_part_image_set(ed, ep, &set, pos);
-
-         /* border */
-         _edje_calc_params_need_type_common(params);
-         params->type.common->spec.image.l = img_desc->image.border.l;
-         params->type.common->spec.image.r = img_desc->image.border.r;
-
-         params->type.common->spec.image.t = img_desc->image.border.t;
-         params->type.common->spec.image.b = img_desc->image.border.b;
-
-         params->type.common->spec.image.border_scale_by = 
img_desc->image.border.scale_by;
-
-         if (set && set->set)
-           {
-#define SET_BORDER_DEFINED(Result, Value) Result = Value ? Value : Result;
-              SET_BORDER_DEFINED(params->type.common->spec.image.l, 
set->entry->border.l);
-              SET_BORDER_DEFINED(params->type.common->spec.image.r, 
set->entry->border.r);
-              SET_BORDER_DEFINED(params->type.common->spec.image.t, 
set->entry->border.t);
-              SET_BORDER_DEFINED(params->type.common->spec.image.b, 
set->entry->border.b);
-
-              params->type.common->spec.image.border_scale_by = 
NEQ(set->entry->border.scale_by, ZERO) ?
-                set->entry->border.scale_by : 
params->type.common->spec.image.border_scale_by;
-           }
-
-         break;
-      }
-
+        _edje_part_calc_single_image0(ed, ep, params, 
(Edje_Part_Description_Image *)desc, pos);
+        break;
       case EDJE_PART_TYPE_TEXT:
       case EDJE_PART_TYPE_TEXTBLOCK:
-      {
-         Edje_Part_Description_Text *text_desc = (Edje_Part_Description_Text 
*)desc;
-
-         _edje_calc_params_need_type_text(params);
-         /* text.align */
-         params->type.text->align.x = text_desc->text.align.x;
-         params->type.text->align.y = text_desc->text.align.y;
-         params->type.text->ellipsis = text_desc->text.ellipsis;
-
-         /* text colors */
-         if (cc)
-           {
-              params->type.text->color2.r = (((int)cc->r2 + 1) * 
text_desc->common.color2.r) >> 8;
-              params->type.text->color2.g = (((int)cc->g2 + 1) * 
text_desc->common.color2.g) >> 8;
-              params->type.text->color2.b = (((int)cc->b2 + 1) * 
text_desc->common.color2.b) >> 8;
-              params->type.text->color2.a = (((int)cc->a2 + 1) * 
text_desc->common.color2.a) >> 8;
-              params->type.text->color3.r = (((int)cc->r3 + 1) * 
text_desc->text.color3.r) >> 8;
-              params->type.text->color3.g = (((int)cc->g3 + 1) * 
text_desc->text.color3.g) >> 8;
-              params->type.text->color3.b = (((int)cc->b3 + 1) * 
text_desc->text.color3.b) >> 8;
-              params->type.text->color3.a = (((int)cc->a3 + 1) * 
text_desc->text.color3.a) >> 8;
-           }
-         else
-           {
-              params->type.text->color2.r = text_desc->common.color2.r;
-              params->type.text->color2.g = text_desc->common.color2.g;
-              params->type.text->color2.b = text_desc->common.color2.b;
-              params->type.text->color2.a = text_desc->common.color2.a;
-              params->type.text->color3.r = text_desc->text.color3.r;
-              params->type.text->color3.g = text_desc->text.color3.g;
-              params->type.text->color3.b = text_desc->text.color3.b;
-              params->type.text->color3.a = text_desc->text.color3.a;
-           }
-
-         break;
-      }
-
+        _edje_part_calc_single_text0(params, (Edje_Part_Description_Text 
*)desc, cc);
+        break;
       case EDJE_PART_TYPE_SPACER:
       case EDJE_PART_TYPE_RECTANGLE:
       case EDJE_PART_TYPE_BOX:
@@ -2882,136 +3051,56 @@ _edje_part_recalc_single(Edje *ed,
       case EDJE_PART_TYPE_SNAPSHOT:
       case EDJE_PART_TYPE_VECTOR:
         break;
-
       case EDJE_PART_TYPE_LIGHT:
-      {
-         Edje_Part_Description_Light *light_desc = 
(Edje_Part_Description_Light *)desc;
-
-         _edje_calc_params_need_type_node(params);
-         params->type.node->data[0] = light_desc->light.orientation.data[0];
-         params->type.node->point.x = light_desc->light.position.point.x;
-         params->type.node->point.y = light_desc->light.position.point.y;
-         params->type.node->point.z = light_desc->light.position.point.z;
-
-         break;
-      }
-
+        _edje_part_calc_single_light0(params, (Edje_Part_Description_Light 
*)desc);
+        break;
       case EDJE_PART_TYPE_CAMERA:
-      {
-         Edje_Part_Description_Camera *camera_desc = 
(Edje_Part_Description_Camera *)desc;
-
-         _edje_calc_params_need_type_node(params);
-         params->type.node->data[0] = camera_desc->camera.orientation.data[0];
-         params->type.node->point.x = camera_desc->camera.position.point.x;
-         params->type.node->point.y = camera_desc->camera.position.point.y;
-         params->type.node->point.z = camera_desc->camera.position.point.z;
-
-         break;
-      }
-
+        _edje_part_calc_single_camera0(params, (Edje_Part_Description_Camera 
*)desc);
+        break;
       case EDJE_PART_TYPE_MESH_NODE:
-      {
-         Edje_Part_Description_Mesh_Node *mesh_desc = 
(Edje_Part_Description_Mesh_Node *)desc;
-
-         _edje_calc_params_need_type_node(params);
-         params->type.node->frame = mesh_desc->mesh_node.mesh.frame;
-         params->type.node->data[0] = mesh_desc->mesh_node.orientation.data[0];
-         params->type.node->point.x = mesh_desc->mesh_node.position.point.x;
-         params->type.node->point.y = mesh_desc->mesh_node.position.point.y;
-         params->type.node->point.z = mesh_desc->mesh_node.position.point.z;
-         params->type.node->scale_3d.x = mesh_desc->mesh_node.scale_3d.x;
-         params->type.node->scale_3d.y = mesh_desc->mesh_node.scale_3d.y;
-         params->type.node->scale_3d.z = mesh_desc->mesh_node.scale_3d.z;
-
-         break;
-      }
-
+        _edje_part_calc_single_mesh0(params, (Edje_Part_Description_Mesh_Node 
*)desc);
+        break;
       case EDJE_PART_TYPE_GRADIENT:
-        /* FIXME: THIS ONE SHOULD NEVER BE TRIGGERED. */
+        // FIXME: THIS ONE SHOULD NEVER BE TRIGGERED
         break;
-
       default:
         break;
      }
 
-   /* if we have text that wants to make the min size the text size... */
-   if (ep->part->type == EDJE_PART_TYPE_TEXTBLOCK)
-     _edje_part_recalc_single_textblock(sc, ed, ep, 
(Edje_Part_Description_Text *)chosen_desc, params, &minw, &minh, &maxw, &maxh);
-   else if (ep->part->type == EDJE_PART_TYPE_TEXT)
+   // limit size if needed
+   switch (ep->part->type)
      {
-        _edje_part_recalc_single_text(sc, ed, ep, 
(Edje_Part_Description_Text*) desc, (Edje_Part_Description_Text*) chosen_desc, 
params, &minw, &minh, &maxw, &maxh);
+      // if we have text that wants to make the min size the text size...
+      case EDJE_PART_TYPE_TEXTBLOCK:
+        _edje_part_recalc_single_textblock(sc, ed, ep, 
(Edje_Part_Description_Text *)chosen_desc, params, &minw, &minh, &maxw, &maxh);
+        break;
+      case EDJE_PART_TYPE_TEXT:
+        _edje_part_recalc_single_text(sc, ed, ep, (Edje_Part_Description_Text 
*)desc, (Edje_Part_Description_Text *)chosen_desc, params, &minw, &minh, &maxw, 
&maxh);
         _edje_part_recalc_single_filter(ed, ep, desc, chosen_desc, pos);
-     }
-
-   if ((ep->part->type == EDJE_PART_TYPE_TABLE) &&
-       (((((Edje_Part_Description_Table *)chosen_desc)->table.min.h) ||
-         (((Edje_Part_Description_Table *)chosen_desc)->table.min.v))))
-     {
-        Eina_Size2D lmin;
-
-        efl_canvas_group_need_recalculate_set(ep->object, 1);
-        efl_canvas_group_calculate(ep->object);
-        lmin = efl_gfx_hint_size_restricted_min_get(ep->object);
-        if (((Edje_Part_Description_Table *)chosen_desc)->table.min.h)
-          {
-             if (lmin.w > minw) minw = lmin.w;
-          }
-        if (((Edje_Part_Description_Table *)chosen_desc)->table.min.v)
-          {
-             if (lmin.h > minh) minh = lmin.h;
-          }
-     }
-   else if ((ep->part->type == EDJE_PART_TYPE_BOX) &&
-            ((((Edje_Part_Description_Box *)chosen_desc)->box.min.h) ||
-             (((Edje_Part_Description_Box *)chosen_desc)->box.min.v)))
-     {
-        Eina_Size2D lmin;
-
-        efl_canvas_group_need_recalculate_set(ep->object, 1);
-        efl_canvas_group_calculate(ep->object);
-        lmin = efl_gfx_hint_size_restricted_min_get(ep->object);
-        if (((Edje_Part_Description_Box *)chosen_desc)->box.min.h)
-          {
-             if (lmin.w > minw) minw = lmin.w;
-          }
-        if (((Edje_Part_Description_Box *)chosen_desc)->box.min.v)
-          {
-             if (lmin.h > minh) minh = lmin.h;
-          }
-     }
-   else if (ep->part->type == EDJE_PART_TYPE_IMAGE)
-     {
+        break;
+      // or table/box containers that want to do the same
+      case EDJE_PART_TYPE_TABLE:
+        if (((((Edje_Part_Description_Table *)chosen_desc)->table.min.h) ||
+             (((Edje_Part_Description_Table *)chosen_desc)->table.min.v)))
+          _edje_part_recalc_single_table(ep, chosen_desc, &minw, &minh);
+        break;
+      case EDJE_PART_TYPE_BOX:
+        if ((((Edje_Part_Description_Box *)chosen_desc)->box.min.h) ||
+            (((Edje_Part_Description_Box *)chosen_desc)->box.min.v))
+          _edje_part_recalc_single_box(ep, chosen_desc, &minw, &minh);
+        break;
+      // or an image that also wants to do this
+      case EDJE_PART_TYPE_IMAGE:
         if (chosen_desc->min.limit || chosen_desc->max.limit)
-          {
-             Evas_Coord w, h;
-
-             /* We only need pos to find the right image that would be 
displayed */
-             /* Yes, if someone set aspect preference to SOURCE and also 
max,min
-           to SOURCE, it will be under efficient, but who cares at the
-           moment. */
-             _edje_real_part_image_set(ed, ep, NULL, pos);
-             evas_object_image_size_get(ep->object, &w, &h);
-
-             if (chosen_desc->min.limit)
-               {
-                  if (w > minw) minw = w;
-                  if (h > minh) minh = h;
-               }
-             if (chosen_desc->max.limit)
-               {
-                  if ((maxw <= 0) || (w < maxw)) maxw = w;
-                  if ((maxh <= 0) || (h < maxh)) maxh = h;
-               }
-          }
-        _edje_part_recalc_single_filter(ed, ep, desc, chosen_desc, pos);
-     }
-   else if (ep->part->type == EDJE_PART_TYPE_PROXY)
-     {
-        _edje_part_recalc_single_filter(ed, ep, desc, chosen_desc, pos);
-     }
-   else if (ep->part->type == EDJE_PART_TYPE_SNAPSHOT)
-     {
+          _edje_part_recalc_single_image(ed, ep, chosen_desc, pos, &minw, 
&minh, &maxw, &maxh);
+        EINA_FALLTHROUGH;
+      case EDJE_PART_TYPE_PROXY:
+      case EDJE_PART_TYPE_SNAPSHOT:
+        // image. proxy, snapshot share this filter recalc, so fall through
         _edje_part_recalc_single_filter(ed, ep, desc, chosen_desc, pos);
+        break;
+      default:
+        break;
      }
 
    /* remember what our size is BEFORE we go limit it */
@@ -3044,34 +3133,8 @@ _edje_part_recalc_single(Edje *ed,
      _edje_part_recalc_single_fill(ep, &((Edje_Part_Description_Proxy 
*)desc)->proxy.fill, params);
 
 #ifdef HAVE_EPHYSICS
-   if (ep->part->physics_body || ep->body)
-     {
-        EINA_COW_CALC_PHYSICS_BEGIN(params, params_write)
-        {
-           params_write->mass = desc->physics.mass;
-           params_write->restitution = desc->physics.restitution;
-           params_write->friction = desc->physics.friction;
-           params_write->damping.linear = desc->physics.damping.linear;
-           params_write->damping.angular = desc->physics.damping.angular;
-           params_write->sleep.linear = desc->physics.sleep.linear;
-           params_write->sleep.angular = desc->physics.sleep.angular;
-           params_write->material = desc->physics.material;
-           params_write->density = desc->physics.density;
-           params_write->hardness = desc->physics.hardness;
-           params_write->ignore_part_pos = desc->physics.ignore_part_pos;
-           params_write->light_on = desc->physics.light_on;
-           params_write->mov_freedom.lin.x = desc->physics.mov_freedom.lin.x;
-           params_write->mov_freedom.lin.y = desc->physics.mov_freedom.lin.y;
-           params_write->mov_freedom.lin.z = desc->physics.mov_freedom.lin.z;
-           params_write->mov_freedom.ang.x = desc->physics.mov_freedom.ang.x;
-           params_write->mov_freedom.ang.y = desc->physics.mov_freedom.ang.y;
-           params_write->mov_freedom.ang.z = desc->physics.mov_freedom.ang.z;
-           params_write->backcull = desc->physics.backcull;
-           params_write->z = desc->physics.z;
-           params_write->depth = desc->physics.depth;
-        }
-        EINA_COW_CALC_PHYSICS_END(params, params_write);
-     }
+   if (EINA_UNLIKELY(ep->part->physics_body || ep->body))
+     _edje_part_recalc_single_physics(params, desc);
 #endif
    _edje_part_recalc_single_map(ed, ep, center, zoom_center, light, persp, 
desc, chosen_desc, params);
 }

-- 


Reply via email to