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.
This commit is contained in:
Carsten Haitzler 2019-08-20 09:43:52 +01:00
parent 55b3e8e96d
commit cfa8224140
1 changed files with 309 additions and 246 deletions

View File

@ -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;
}
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;
}
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;
}
case EDJE_PART_TYPE_GRADIENT:
/* FIXME: THIS ONE SHOULD NEVER BE TRIGGERED. */
_edje_part_calc_single_light0(params, (Edje_Part_Description_Light *)desc);
break;
case EDJE_PART_TYPE_CAMERA:
_edje_part_calc_single_camera0(params, (Edje_Part_Description_Camera *)desc);
break;
case EDJE_PART_TYPE_MESH_NODE:
_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
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);
}