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