summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/edje/edje_calc.c761
-rw-r--r--src/lib/edje/edje_embryo.c5
-rw-r--r--src/lib/edje/edje_load.c25
-rw-r--r--src/lib/edje/edje_private.h121
-rw-r--r--src/lib/edje/edje_program.c14
-rw-r--r--src/lib/edje/edje_text.c90
6 files changed, 602 insertions, 414 deletions
diff --git a/src/lib/edje/edje_calc.c b/src/lib/edje/edje_calc.c
index a7bb865481..a9d9204ad3 100644
--- a/src/lib/edje/edje_calc.c
+++ b/src/lib/edje/edje_calc.c
@@ -20,16 +20,18 @@ static void _edje_part_recalc_single(Edje *ed, Edje_Rea
FLOAT_T pos);
#define EINA_COW_CALC_PHYSICS_BEGIN(Calc, Write) \
- EINA_COW_WRITE_BEGIN(_edje_calc_params_physics_cow, Calc->physics, Edje_Calc_Params_Physics, Write)
+ _edje_calc_params_need_ext(Calc); \
+ EINA_COW_WRITE_BEGIN(_edje_calc_params_physics_cow, Calc->ext->physics, Edje_Calc_Params_Physics, Write)
#define EINA_COW_CALC_PHYSICS_END(Calc, Write) \
- EINA_COW_WRITE_END(_edje_calc_params_physics_cow, Calc->physics, Write)
+ EINA_COW_WRITE_END(_edje_calc_params_physics_cow, Calc->ext->physics, Write)
#define EINA_COW_CALC_MAP_BEGIN(Calc, Write) \
- EINA_COW_WRITE_BEGIN(_edje_calc_params_map_cow, Calc->map, Edje_Calc_Params_Map, Write)
+ _edje_calc_params_need_ext(Calc); \
+ EINA_COW_WRITE_BEGIN(_edje_calc_params_map_cow, Calc->ext->map, Edje_Calc_Params_Map, Write)
#define EINA_COW_CALC_MAP_END(Calc, Write) \
- EINA_COW_WRITE_END(_edje_calc_params_map_cow, Calc->map, Write);
+ EINA_COW_WRITE_END(_edje_calc_params_map_cow, Calc->ext->map, Write)
#ifdef BUILD_EDJE_FP
@@ -92,6 +94,27 @@ static void _edje_part_recalc_single(Edje *ed, Edje_Rea
void
+_edje_calc_params_clear(Edje_Calc_Params *p)
+{
+ // this happens to cover type.common, type.text and type.node
+ if (p->type.common) free(p->type.common);
+ p->type.common = NULL;
+
+ // handle cow stuff in one place
+ if (p->ext)
+ {
+ eina_cow_free(_edje_calc_params_map_cow, (const Eina_Cow_Data **)&(p->ext->map));
+ p->ext->map = NULL;
+#ifdef HAVE_EPHYSICS
+ eina_cow_free(_edje_calc_params_physics_cow, (const Eina_Cow_Data **)&(p->ext->physics));
+ p->ext->physics = NULL;
+#endif
+ free(p->ext);
+ p->ext = NULL;
+ }
+}
+
+void
_edje_part_pos_set(Edje *ed, Edje_Real_Part *ep, int mode, FLOAT_T pos, FLOAT_T v1, FLOAT_T v2, FLOAT_T v3, FLOAT_T v4)
{
FLOAT_T fp_pos;
@@ -745,10 +768,6 @@ _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char *d1, doubl
ep->param2 = eina_mempool_malloc(_edje_real_part_state_mp,
sizeof(Edje_Real_Part_State));
memset(ep->param2, 0, sizeof(Edje_Real_Part_State));
- ep->param2->p.map = eina_cow_alloc(_edje_calc_params_map_cow);
-#ifdef HAVE_EPHYSICS
- ep->param2->p.physics = eina_cow_alloc(_edje_calc_params_physics_cow);
-#endif
}
else if (ep->part->type == EDJE_PART_TYPE_EXTERNAL)
{
@@ -772,9 +791,8 @@ _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char *d1, doubl
if (ep->param2)
{
free(ep->param2->set);
- eina_cow_free(_edje_calc_params_map_cow, (const Eina_Cow_Data **)&ep->param2->p.map);
-#ifdef HAVE_EPHYSICS
- eina_cow_free(_edje_calc_params_physics_cow, (const Eina_Cow_Data **)&ep->param2->p.physics);
+#ifdef EDJE_CALC_CACHE
+ _edje_calc_params_clear(&(ep->param2->p));
#endif
}
eina_mempool_free(_edje_real_part_state_mp, ep->param2);
@@ -1686,7 +1704,9 @@ _edje_part_recalc_single_text(FLOAT_T sc EINA_UNUSED,
_edje_text_class_font_get(ed, desc, &size, &sfont);
free(sfont);
- params->type.text.size = size; /* XXX TODO used by further calcs, go inside recalc_apply? */
+
+ _edje_calc_params_need_type_text(params);
+ params->type.text->size = size; /* XXX TODO used by further calcs, go inside recalc_apply? */
_edje_text_recalc_apply(ed, ep, params, chosen_desc, EINA_TRUE);
@@ -2048,6 +2068,7 @@ _edje_part_recalc_single_drag_threshold(Edje_Real_Part *ep,
Edje_Real_Part *threshold,
Edje_Calc_Params *params)
{
+ _edje_calc_params_need_ext(params);
if (threshold)
{
if (ep->drag->threshold_started_x &&
@@ -2055,14 +2076,14 @@ _edje_part_recalc_single_drag_threshold(Edje_Real_Part *ep,
TO_INT(params->eval.x) + TO_INT(params->eval.w) < threshold->x + threshold->w)
{
// Cancel movement to previous position due to our presence inside the threshold
- params->eval.x = FROM_INT(params->req_drag.x);
- params->eval.w = FROM_INT(params->req_drag.w);
+ params->eval.x = FROM_INT(params->ext->req_drag.x);
+ params->eval.w = FROM_INT(params->ext->req_drag.w);
ep->drag->threshold_x = EINA_TRUE;
}
else
{
- params->req_drag.x = TO_INT(params->eval.x);
- params->req_drag.w = TO_INT(params->eval.w);
+ params->ext->req_drag.x = TO_INT(params->eval.x);
+ params->ext->req_drag.w = TO_INT(params->eval.w);
ep->drag->threshold_started_x = EINA_FALSE;
}
if (ep->drag->threshold_started_y &&
@@ -2070,23 +2091,23 @@ _edje_part_recalc_single_drag_threshold(Edje_Real_Part *ep,
TO_INT(params->eval.y) + TO_INT(params->eval.h) < threshold->y + threshold->h)
{
// Cancel movement to previous position due to our presence inside the threshold
- params->eval.y = FROM_INT(params->req_drag.y);
- params->eval.h = FROM_INT(params->req_drag.h);
+ params->eval.y = FROM_INT(params->ext->req_drag.y);
+ params->eval.h = FROM_INT(params->ext->req_drag.h);
ep->drag->threshold_y = EINA_TRUE;
}
else
{
- params->req_drag.y = TO_INT(params->eval.y);
- params->req_drag.h = TO_INT(params->eval.h);
+ params->ext->req_drag.y = TO_INT(params->eval.y);
+ params->ext->req_drag.h = TO_INT(params->eval.h);
ep->drag->threshold_started_y = EINA_FALSE;
}
}
else
{
- params->req_drag.x = TO_INT(params->eval.x);
- params->req_drag.w = TO_INT(params->eval.w);
- params->req_drag.y = TO_INT(params->eval.y);
- params->req_drag.h = TO_INT(params->eval.h);
+ params->ext->req_drag.x = TO_INT(params->eval.x);
+ params->ext->req_drag.w = TO_INT(params->eval.w);
+ params->ext->req_drag.y = TO_INT(params->eval.y);
+ params->ext->req_drag.h = TO_INT(params->eval.h);
}
}
@@ -2195,9 +2216,10 @@ _edje_part_recalc_single_fill(Edje_Real_Part *ep,
else
fw = params->final.w;
- params->type.common.fill.x = fill->pos_abs_x
+ _edje_calc_params_need_type_common(params);
+ params->type.common->fill.x = fill->pos_abs_x
+ TO_INT(SCALE(fill->pos_rel_x, fw));
- params->type.common.fill.w = fill->abs_x
+ params->type.common->fill.w = fill->abs_x
+ TO_INT(SCALE(fill->rel_x, fw));
if (fill->type == EDJE_FILL_TYPE_TILE)
@@ -2205,9 +2227,9 @@ _edje_part_recalc_single_fill(Edje_Real_Part *ep,
else
fh = params->final.h;
- params->type.common.fill.y = fill->pos_abs_y
+ params->type.common->fill.y = fill->pos_abs_y
+ TO_INT(SCALE(fill->pos_rel_y, fh));
- params->type.common.fill.h = fill->abs_y
+ params->type.common->fill.h = fill->abs_y
+ TO_INT(SCALE(fill->rel_y, fh));
}
@@ -2800,7 +2822,11 @@ _edje_part_recalc_single(Edje *ed,
params->visible = desc->visible;
/* clip override */
- params->clip_to = clip_to;
+ if (clip_to)
+ {
+ _edje_calc_params_need_ext(params);
+ params->ext->clip_to = clip_to;
+ }
/* set parameters, some are required for recalc_single_text[block] */
switch (ep->part->type)
@@ -2813,23 +2839,24 @@ _edje_part_recalc_single(Edje *ed,
_edje_real_part_image_set(ed, ep, &set, pos);
/* border */
- params->type.common.spec.image.l = img_desc->image.border.l;
- params->type.common.spec.image.r = img_desc->image.border.r;
+ _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.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;
+ 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);
+ 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);
- SET_BORDER_DEFINED(params->type.common.spec.image.border_scale_by, set->entry->border.scale_by);
+ SET_BORDER_DEFINED(params->type.common->spec.image.border_scale_by, set->entry->border.scale_by);
}
break;
@@ -2840,33 +2867,34 @@ _edje_part_recalc_single(Edje *ed,
{
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;
+ 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;
+ 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;
+ 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;
@@ -2887,10 +2915,11 @@ _edje_part_recalc_single(Edje *ed,
{
Edje_Part_Description_Light *light_desc = (Edje_Part_Description_Light *)desc;
- 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;
+ _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;
}
@@ -2899,10 +2928,11 @@ _edje_part_recalc_single(Edje *ed,
{
Edje_Part_Description_Camera *camera_desc = (Edje_Part_Description_Camera *)desc;
- 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;
+ _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;
}
@@ -2911,14 +2941,15 @@ _edje_part_recalc_single(Edje *ed,
{
Edje_Part_Description_Mesh_Node *mesh_desc = (Edje_Part_Description_Mesh_Node *)desc;
- 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;
+ _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;
}
@@ -3147,7 +3178,7 @@ _edje_proxy_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edj
else
part_id = chosen_desc->proxy.id;
- if ((p3->type.common.fill.w == 0) || (p3->type.common.fill.h == 0) ||
+ if ((p3->type.common->fill.w == 0) || (p3->type.common->fill.h == 0) ||
(part_id < 0))
{
evas_object_image_source_set(ep->object, NULL);
@@ -3195,7 +3226,7 @@ _edje_proxy_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edj
}
}
- efl_gfx_fill_set(ep->object, p3->type.common.fill.x, p3->type.common.fill.y, p3->type.common.fill.w, p3->type.common.fill.h);
+ efl_gfx_fill_set(ep->object, p3->type.common->fill.x, p3->type.common->fill.y, p3->type.common->fill.w, p3->type.common->fill.h);
efl_image_smooth_scale_set(ep->object, p3->smooth);
evas_object_image_source_visible_set(ep->object, chosen_desc->proxy.source_visible);
evas_object_image_source_clip_set(ep->object, chosen_desc->proxy.source_clip);
@@ -3213,32 +3244,33 @@ _edje_image_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edj
_edje_real_part_image_set(ed, ep, &set, pos);
/* border */
- p3->type.common.spec.image.l = chosen_desc->image.border.l;
- p3->type.common.spec.image.r = chosen_desc->image.border.r;
+ _edje_calc_params_need_type_common(p3);
+ p3->type.common->spec.image.l = chosen_desc->image.border.l;
+ p3->type.common->spec.image.r = chosen_desc->image.border.r;
- p3->type.common.spec.image.t = chosen_desc->image.border.t;
- p3->type.common.spec.image.b = chosen_desc->image.border.b;
+ p3->type.common->spec.image.t = chosen_desc->image.border.t;
+ p3->type.common->spec.image.b = chosen_desc->image.border.b;
- p3->type.common.spec.image.border_scale_by = chosen_desc->image.border.scale_by;
+ p3->type.common->spec.image.border_scale_by = chosen_desc->image.border.scale_by;
if (set && set->set)
{
#define SET_BORDER_DEFINED(Result, Value) Result = Value ? Value : Result;
- SET_BORDER_DEFINED(p3->type.common.spec.image.l, set->entry->border.l);
- SET_BORDER_DEFINED(p3->type.common.spec.image.r, set->entry->border.r);
- SET_BORDER_DEFINED(p3->type.common.spec.image.t, set->entry->border.t);
- SET_BORDER_DEFINED(p3->type.common.spec.image.b, set->entry->border.b);
+ SET_BORDER_DEFINED(p3->type.common->spec.image.l, set->entry->border.l);
+ SET_BORDER_DEFINED(p3->type.common->spec.image.r, set->entry->border.r);
+ SET_BORDER_DEFINED(p3->type.common->spec.image.t, set->entry->border.t);
+ SET_BORDER_DEFINED(p3->type.common->spec.image.b, set->entry->border.b);
- SET_BORDER_DEFINED(p3->type.common.spec.image.border_scale_by, set->entry->border.scale_by);
+ SET_BORDER_DEFINED(p3->type.common->spec.image.border_scale_by, set->entry->border.scale_by);
}
- efl_gfx_fill_set(ep->object, p3->type.common.fill.x, p3->type.common.fill.y, p3->type.common.fill.w, p3->type.common.fill.h);
+ efl_gfx_fill_set(ep->object, p3->type.common->fill.x, p3->type.common->fill.y, p3->type.common->fill.w, p3->type.common->fill.h);
efl_image_smooth_scale_set(ep->object, p3->smooth);
if (chosen_desc->image.border.scale)
{
- if (p3->type.common.spec.image.border_scale_by > FROM_DOUBLE(0.0))
+ if (p3->type.common->spec.image.border_scale_by > FROM_DOUBLE(0.0))
{
- FLOAT_T sc2 = MUL(sc, p3->type.common.spec.image.border_scale_by);
+ FLOAT_T sc2 = MUL(sc, p3->type.common->spec.image.border_scale_by);
evas_object_image_border_scale_set(ep->object, TO_DOUBLE(sc2));
}
else
@@ -3246,14 +3278,14 @@ _edje_image_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edj
}
else
{
- if (p3->type.common.spec.image.border_scale_by > FROM_DOUBLE(0.0))
+ if (p3->type.common->spec.image.border_scale_by > FROM_DOUBLE(0.0))
evas_object_image_border_scale_set
- (ep->object, TO_DOUBLE(p3->type.common.spec.image.border_scale_by));
+ (ep->object, TO_DOUBLE(p3->type.common->spec.image.border_scale_by));
else
evas_object_image_border_scale_set(ep->object, 1.0);
}
- evas_object_image_border_set(ep->object, p3->type.common.spec.image.l, p3->type.common.spec.image.r,
- p3->type.common.spec.image.t, p3->type.common.spec.image.b);
+ evas_object_image_border_set(ep->object, p3->type.common->spec.image.l, p3->type.common->spec.image.r,
+ p3->type.common->spec.image.t, p3->type.common->spec.image.b);
if (chosen_desc->image.border.no_fill == 0)
evas_object_image_border_center_fill_set(ep->object, EVAS_BORDER_FILL_DEFAULT);
else if (chosen_desc->image.border.no_fill == 1)
@@ -3364,16 +3396,17 @@ _edje_physics_body_props_update(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *
Eina_Bool pos_update)
{
if (!EPH_LOAD()) return;
+ _edje_calc_params_need_ext(pf);
EPH_CALL(ephysics_body_linear_movement_enable_set)
(ep->body,
- pf->physics->mov_freedom.lin.x,
- pf->physics->mov_freedom.lin.y,
- pf->physics->mov_freedom.lin.z);
+ pf->ext->physics->mov_freedom.lin.x,
+ pf->ext->physics->mov_freedom.lin.y,
+ pf->ext->physics->mov_freedom.lin.z);
EPH_CALL(ephysics_body_angular_movement_enable_set)
(ep->body,
- pf->physics->mov_freedom.ang.x,
- pf->physics->mov_freedom.ang.y,
- pf->physics->mov_freedom.ang.z);
+ pf->ext->physics->mov_freedom.ang.x,
+ pf->ext->physics->mov_freedom.ang.y,
+ pf->ext->physics->mov_freedom.ang.z);
/* Boundaries geometry and mass shouldn't be changed */
if (ep->part->physics_body < EDJE_PART_PHYSICS_BODY_BOUNDARY_TOP)
@@ -3386,7 +3419,7 @@ _edje_physics_body_props_update(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *
(ep->body,
ed->x + pf->final.x,
ed->y + pf->final.y,
- pf->physics->z);
+ pf->ext->physics->z);
ep->x = pf->final.x;
ep->y = pf->final.y;
ep->w = pf->final.w;
@@ -3394,18 +3427,18 @@ _edje_physics_body_props_update(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *
}
EPH_CALL(ephysics_body_geometry_get)(ep->body, &x, &y, &z, &w, &h, &d);
- if ((d) && (d != pf->physics->depth))
- EPH_CALL(ephysics_body_resize)(ep->body, w, h, pf->physics->depth);
- if (z != pf->physics->z)
- EPH_CALL(ephysics_body_move)(ep->body, x, y, pf->physics->z);
+ if ((d) && (d != pf->ext->physics->depth))
+ EPH_CALL(ephysics_body_resize)(ep->body, w, h, pf->ext->physics->depth);
+ if (z != pf->ext->physics->z)
+ EPH_CALL(ephysics_body_move)(ep->body, x, y, pf->ext->physics->z);
- EPH_CALL(ephysics_body_material_set)(ep->body, pf->physics->material);
- if (!pf->physics->material)
+ EPH_CALL(ephysics_body_material_set)(ep->body, pf->ext->physics->material);
+ if (!pf->ext->physics->material)
{
- if (pf->physics->density)
- EPH_CALL(ephysics_body_density_set)(ep->body, pf->physics->density);
+ if (pf->ext->physics->density)
+ EPH_CALL(ephysics_body_density_set)(ep->body, pf->ext->physics->density);
else
- EPH_CALL(ephysics_body_mass_set)(ep->body, pf->physics->mass);
+ EPH_CALL(ephysics_body_mass_set)(ep->body, pf->ext->physics->mass);
}
if ((ep->part->physics_body == EDJE_PART_PHYSICS_BODY_SOFT_BOX) ||
@@ -3413,21 +3446,21 @@ _edje_physics_body_props_update(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *
(ep->part->physics_body == EDJE_PART_PHYSICS_BODY_SOFT_CYLINDER) ||
(ep->part->physics_body == EDJE_PART_PHYSICS_BODY_CLOTH))
EPH_CALL(ephysics_body_soft_body_hardness_set)
- (ep->body, pf->physics->hardness * 100);
+ (ep->body, pf->ext->physics->hardness * 100);
}
- if (!pf->physics->material)
+ if (!pf->ext->physics->material)
{
- EPH_CALL(ephysics_body_restitution_set)(ep->body, pf->physics->restitution);
- EPH_CALL(ephysics_body_friction_set)(ep->body, pf->physics->friction);
+ EPH_CALL(ephysics_body_restitution_set)(ep->body, pf->ext->physics->restitution);
+ EPH_CALL(ephysics_body_friction_set)(ep->body, pf->ext->physics->friction);
}
- EPH_CALL(ephysics_body_damping_set)(ep->body, pf->physics->damping.linear,
- pf->physics->damping.angular);
- EPH_CALL(ephysics_body_sleeping_threshold_set)(ep->body, pf->physics->sleep.linear,
- pf->physics->sleep.angular);
- EPH_CALL(ephysics_body_light_set)(ep->body, pf->physics->light_on);
- EPH_CALL(ephysics_body_back_face_culling_set)(ep->body, pf->physics->backcull);
+ EPH_CALL(ephysics_body_damping_set)(ep->body, pf->ext->physics->damping.linear,
+ pf->ext->physics->damping.angular);
+ EPH_CALL(ephysics_body_sleeping_threshold_set)(ep->body, pf->ext->physics->sleep.linear,
+ pf->ext->physics->sleep.angular);
+ EPH_CALL(ephysics_body_light_set)(ep->body, pf->ext->physics->light_on);
+ EPH_CALL(ephysics_body_back_face_culling_set)(ep->body, pf->ext->physics->backcull);
}
static void
@@ -3559,12 +3592,14 @@ _edje_physics_body_add(Edje *ed, Edje_Real_Part *rp, EPhysics_World *world)
static void
_map_colors_free(Edje_Calc_Params *pf)
{
- Edje_Map_Color **colors = pf->map->colors;
- int i;
+ if (pf->ext)
+ {
+ Edje_Map_Color **colors = pf->ext->map->colors;
+ int i;
- for (i = 0; i < (int)pf->map->colors_count; i++)
- free(colors[i]);
- free(colors);
+ for (i = 0; i < (int)pf->ext->map->colors_count; i++) free(colors[i]);
+ free(colors);
+ }
}
static Eina_Bool
@@ -3577,9 +3612,12 @@ _map_colors_interp(Edje_Calc_Params *p1, Edje_Calc_Params *p2,
unsigned char col1_r = 255, col1_g = 255, col1_b = 255, col1_a = 255;
unsigned char col2_r = 255, col2_g = 255, col2_b = 255, col2_a = 255;
- if ((p1->map->colors_count > 0) || (p2->map->colors_count > 0))
+ _edje_calc_params_need_ext(p1);
+ _edje_calc_params_need_ext(p2);
+
+ if ((p1->ext->map->colors_count > 0) || (p2->ext->map->colors_count > 0))
{
- pmap->colors_count = (p1->map->colors_count > p2->map->colors_count ? p1->map->colors_count : p2->map->colors_count);
+ pmap->colors_count = (p1->ext->map->colors_count > p2->ext->map->colors_count ? p1->ext->map->colors_count : p2->ext->map->colors_count);
pmap->colors = (Edje_Map_Color **)malloc(sizeof(Edje_Map_Color *) * (int)pmap->colors_count);
@@ -3591,9 +3629,9 @@ _map_colors_interp(Edje_Calc_Params *p1, Edje_Calc_Params *p2,
col3->idx = i; /* we don't care about index position anyway */
/* find color with idx from first */
- for (j = 0; j < (int)p1->map->colors_count; j++)
+ for (j = 0; j < (int)p1->ext->map->colors_count; j++)
{
- col = p1->map->colors[j];
+ col = p1->ext->map->colors[j];
if (col3->idx == col->idx)
{
col1_r = col->r;
@@ -3604,9 +3642,9 @@ _map_colors_interp(Edje_Calc_Params *p1, Edje_Calc_Params *p2,
}
}
/* find color from idx from second */
- for (j = 0; j < (int)p2->map->colors_count; j++)
+ for (j = 0; j < (int)p2->ext->map->colors_count; j++)
{
- col2 = p2->map->colors[j];
+ col2 = p2->ext->map->colors[j];
if (col3->idx == col2->idx)
{
col2_r = col2->r;
@@ -3638,11 +3676,13 @@ _edje_map_prop_set(Evas_Map *map, const Edje_Calc_Params *pf,
Edje_Part_Description_Common *chosen_desc,
Edje_Real_Part *ep, Evas_Object *mo)
{
- Edje_Map_Color **colors = pf->map->colors;
- int colors_cnt = pf->map->colors_count;
- int i;
+ Edje_Map_Color *color, **colors;
+ int colors_cnt, i;
- Edje_Map_Color *color;
+ if (!pf->ext) return;
+
+ colors = pf->ext->map->colors;
+ colors_cnt = pf->ext->map->colors_count;
evas_map_util_points_populate_from_object(map, ep->object);
@@ -3681,33 +3721,33 @@ _edje_map_prop_set(Evas_Map *map, const Edje_Calc_Params *pf,
//zoom
evas_map_util_zoom(map,
- pf->map->zoom.x, pf->map->zoom.y,
- pf->map->center.x, pf->map->center.y);
+ pf->ext->map->zoom.x, pf->ext->map->zoom.y,
+ pf->ext->map->center.x, pf->ext->map->center.y);
//rotate
evas_map_util_3d_rotate(map,
- TO_DOUBLE(pf->map->rotation.x),
- TO_DOUBLE(pf->map->rotation.y),
- TO_DOUBLE(pf->map->rotation.z),
- pf->map->center.x, pf->map->center.y,
- pf->map->center.z);
+ TO_DOUBLE(pf->ext->map->rotation.x),
+ TO_DOUBLE(pf->ext->map->rotation.y),
+ TO_DOUBLE(pf->ext->map->rotation.z),
+ pf->ext->map->center.x, pf->ext->map->center.y,
+ pf->ext->map->center.z);
// calculate light color & position etc. if there is one
if (pf->lighted)
{
- evas_map_util_3d_lighting(map, pf->map->light.x, pf->map->light.y,
- pf->map->light.z, pf->map->light.r,
- pf->map->light.g, pf->map->light.b,
- pf->map->light.ar, pf->map->light.ag,
- pf->map->light.ab);
+ evas_map_util_3d_lighting(map, pf->ext->map->light.x, pf->ext->map->light.y,
+ pf->ext->map->light.z, pf->ext->map->light.r,
+ pf->ext->map->light.g, pf->ext->map->light.b,
+ pf->ext->map->light.ar, pf->ext->map->light.ag,
+ pf->ext->map->light.ab);
}
// calculate perspective point
if (chosen_desc->map.persp_on)
{
evas_map_util_3d_perspective(map,
- pf->map->persp.x, pf->map->persp.y,
- pf->map->persp.z, pf->map->persp.focal);
+ pf->ext->map->persp.x, pf->ext->map->persp.y,
+ pf->ext->map->persp.z, pf->ext->map->persp.focal);
}
// handle backface culling (object is facing away from view
@@ -3836,6 +3876,54 @@ _circular_dependency_find(Edje *ed, Edje_Real_Part *ep, Edje_Real_Part *cep, Ein
return EINA_FALSE;
}
+static void
+_edje_part_calc_params_memcpy(Edje_Calc_Params *p, Edje_Calc_Params *s, Edje_Part_Type t)
+{
+ if (p->type.common) free(p->type.common);
+ memcpy(p, s, sizeof(Edje_Calc_Params));
+ switch (t)
+ {
+ case EDJE_PART_TYPE_IMAGE:
+ {
+ Edje_Calc_Params_Type_Common *d = malloc(sizeof(*d));
+ if (d)
+ {
+ memcpy(d, s->type.common, sizeof(*d));
+ p->type.common = d;
+ }
+ else p->type.common = NULL;
+ }
+ break;
+ case EDJE_PART_TYPE_TEXT:
+ case EDJE_PART_TYPE_TEXTBLOCK:
+ {
+ Edje_Calc_Params_Type_Text *d = malloc(sizeof(*d));
+ if (d)
+ {
+ memcpy(d, s->type.text, sizeof(*d));
+ p->type.text = d;
+ }
+ else p->type.text = NULL;
+ }
+ break;
+ case EDJE_PART_TYPE_LIGHT:
+ case EDJE_PART_TYPE_CAMERA:
+ case EDJE_PART_TYPE_MESH_NODE:
+ {
+ Edje_Calc_Params_Type_Node *d = malloc(sizeof(*d));
+ if (d)
+ {
+ memcpy(d, s->type.node, sizeof(*d));
+ p->type.node = d;
+ }
+ else p->type.node = NULL;
+ }
+ break;
+ default:
+ break;
+ }
+}
+
void
_edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *state)
{
@@ -3870,6 +3958,18 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
Evas_Coord mmw = 0, mmh = 0;
Eina_Bool map_colors_free = EINA_FALSE;
+#ifdef EDJE_CALC_CACHE
+#else
+ lp1.type.common = NULL;
+ lp1.ext = NULL;
+
+ lp2.type.common = NULL;
+ lp2.ext = NULL;
+#endif
+
+ lp3.type.common = NULL;
+ lp3.ext = NULL;
+
/* GRADIENT ARE GONE, WE MUST IGNORE IT FROM OLD FILE. */
if (ep->part->type == EDJE_PART_TYPE_GRADIENT)
{
@@ -4171,10 +4271,6 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
#ifndef EDJE_CALC_CACHE
p1 = &lp1;
- p1.map = eina_cow_alloc(_edje_calc_params_map_cow);
-#ifdef HAVE_EPHYSICS
- p1.physics = eina_cow_alloc(_edje_calc_params_physics_cow);
-#endif
#else
p1 = &ep->param1.p;
#endif
@@ -4217,37 +4313,41 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
if (ep->current)
{
+ Eina_Bool needext = EINA_FALSE;
const Edje_Calc_Params_Map *map;
#ifdef HAVE_EPHYSICS
const Edje_Calc_Params_Physics *physics;
#endif
- map = p1->map;
+ if (p1->ext)
+ {
+ needext = EINA_TRUE;
+ map = p1->ext->map;
#ifdef HAVE_EPHYSICS
- physics = p1->physics;
+ physics = p1->ext->physics;
#endif
+ }
- /* FIXME: except for text, we don't need in that case to recalc p1 at all*/
- memcpy(p1, ep->current, sizeof (Edje_Calc_Params));
+ _edje_part_calc_params_memcpy(p1, ep->current, ep->part->type);
- p1->map = map;
+ if (needext)
+ {
+ p1->ext = NULL;
+ _edje_calc_params_need_ext(p1);
+ p1->ext->map = map;
#ifdef HAVE_EPHYSICS
- p1->physics = physics;
+ p1->ext->physics = physics;
#endif
- }
-
- p3 = &lp3;
- lp3.map = eina_cow_alloc(_edje_calc_params_map_cow);
+ eina_cow_memcpy(_edje_calc_params_map_cow, (const Eina_Cow_Data **)&p1->ext->map, ep->current->ext->map);
#ifdef HAVE_EPHYSICS
- lp3.physics = eina_cow_alloc(_edje_calc_params_physics_cow);
+ eina_cow_memcpy(_edje_calc_params_physics_cow, (const Eina_Cow_Data **)&p1->ext->physics, ep->current->ext->physics);
#endif
+ }
+ }
+ p3 = &lp3;
#ifndef EDJE_CALC_CACHE
p2 = &lp2;
- lp2.map = eina_cow_alloc(_edje_calc_params_map_cow);
-#ifdef HAVE_EPHYSICS
- lp2.physics = eina_cow_alloc(_edje_calc_params_physics_cow);
-#endif
#else
p2 = &ep->param2->p;
@@ -4296,13 +4396,45 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
/* clip_to will behave a bit like visible */
if (pos == ZERO)
- p3->clip_to = p1->clip_to;
+ {
+ if ((p1->ext) && (p1->ext->clip_to))
+ {
+ _edje_calc_params_need_ext(p3);
+ p3->ext->clip_to = p1->ext->clip_to;
+ }
+ }
else if (pos == FROM_INT(1))
- p3->clip_to = p2->clip_to;
- else if (!p1->clip_to)
- p3->clip_to = p2->clip_to;
+ {
+ if ((p2->ext) && (p2->ext->clip_to))
+ {
+ _edje_calc_params_need_ext(p3);
+ p3->ext->clip_to = p2->ext->clip_to;
+ }
+ }
+ else if ((!p1->ext) || (!p1->ext->clip_to))
+ {
+ if ((p2->ext) && (p2->ext->clip_to))
+ {
+ _edje_calc_params_need_ext(p3);
+ p3->ext->clip_to = p2->ext->clip_to;
+ }
+ else
+ {
+ if (p3->ext) p3->ext->clip_to = NULL;
+ }
+ }
else
- p3->clip_to = p1->clip_to;
+ {
+ if ((p1->ext) && (p1->ext->clip_to))
+ {
+ _edje_calc_params_need_ext(p3);
+ p3->ext->clip_to = p1->ext->clip_to;
+ }
+ else
+ {
+ if (p3->ext) p3->ext->clip_to = NULL;
+ }
+ }
p3->smooth = (beginning_pos) ? p1->smooth : p2->smooth;
@@ -4325,13 +4457,15 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
if (ep->part->dragable.x)
{
- p3->req_drag.x = INTP(p1->req_drag.x, p2->req_drag.x, pos);
- p3->req_drag.w = INTP(p1->req_drag.w, p2->req_drag.w, pos);
+ _edje_calc_params_need_ext(p3);
+ p3->ext->req_drag.x = INTP(p1->ext->req_drag.x, p2->ext->req_drag.x, pos);
+ p3->ext->req_drag.w = INTP(p1->ext->req_drag.w, p2->ext->req_drag.w, pos);
}
if (ep->part->dragable.y)
{
- p3->req_drag.y = INTP(p1->req_drag.y, p2->req_drag.y, pos);
- p3->req_drag.h = INTP(p1->req_drag.h, p2->req_drag.h, pos);
+ _edje_calc_params_need_ext(p3);
+ p3->ext->req_drag.y = INTP(p1->ext->req_drag.y, p2->ext->req_drag.y, pos);
+ p3->ext->req_drag.h = INTP(p1->ext->req_drag.h, p2->ext->req_drag.h, pos);
}
p3->color.r = INTP(p1->color.r, p2->color.r, pos2);
@@ -4342,58 +4476,60 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
#ifdef HAVE_EPHYSICS
if (ep->part->physics_body || ep->body)
{
+ _edje_calc_params_need_ext(p1);
+ _edje_calc_params_need_ext(p2);
EINA_COW_CALC_PHYSICS_BEGIN(p3, p3_write)
{
- p3_write->mass = TO_DOUBLE(FINTP(p1->physics->mass, p2->physics->mass,
+ p3_write->mass = TO_DOUBLE(FINTP(p1->ext->physics->mass, p2->ext->physics->mass,
pos));
- p3_write->restitution = TO_DOUBLE(FINTP(p1->physics->restitution,
- p2->physics->restitution,
+ p3_write->restitution = TO_DOUBLE(FINTP(p1->ext->physics->restitution,
+ p2->ext->physics->restitution,
pos));
- p3_write->friction = TO_DOUBLE(FINTP(p1->physics->friction,
- p2->physics->friction, pos));
- p3_write->density = TO_DOUBLE(FINTP(p1->physics->density,
- p2->physics->density, pos));
- p3_write->hardness = TO_DOUBLE(FINTP(p1->physics->hardness,
- p2->physics->hardness, pos));
-
- p3_write->damping.linear = TO_DOUBLE(FINTP(p1->physics->damping.linear,
- p2->physics->damping.linear, pos));
- p3_write->damping.angular = TO_DOUBLE(FINTP(p1->physics->damping.angular,
- p2->physics->damping.angular, pos));
-
- p3_write->sleep.linear = TO_DOUBLE(FINTP(p1->physics->sleep.linear,
- p2->physics->sleep.linear, pos));
- p3_write->sleep.angular = TO_DOUBLE(FINTP(p1->physics->sleep.angular,
- p2->physics->sleep.angular, pos));
-
- p3_write->z = INTP(p1->physics->z, p2->physics->z, pos);
- p3_write->depth = INTP(p1->physics->depth, p2->physics->depth, pos);
-
- if ((p1->physics->ignore_part_pos) && (p2->physics->ignore_part_pos))
+ p3_write->friction = TO_DOUBLE(FINTP(p1->ext->physics->friction,
+ p2->ext->physics->friction, pos));
+ p3_write->density = TO_DOUBLE(FINTP(p1->ext->physics->density,
+ p2->ext->physics->density, pos));
+ p3_write->hardness = TO_DOUBLE(FINTP(p1->ext->physics->hardness,
+ p2->ext->physics->hardness, pos));
+
+ p3_write->damping.linear = TO_DOUBLE(FINTP(p1->ext->physics->damping.linear,
+ p2->ext->physics->damping.linear, pos));
+ p3_write->damping.angular = TO_DOUBLE(FINTP(p1->ext->physics->damping.angular,
+ p2->ext->physics->damping.angular, pos));
+
+ p3_write->sleep.linear = TO_DOUBLE(FINTP(p1->ext->physics->sleep.linear,
+ p2->ext->physics->sleep.linear, pos));
+ p3_write->sleep.angular = TO_DOUBLE(FINTP(p1->ext->physics->sleep.angular,
+ p2->ext->physics->sleep.angular, pos));
+
+ p3_write->z = INTP(p1->ext->physics->z, p2->ext->physics->z, pos);
+ p3_write->depth = INTP(p1->ext->physics->depth, p2->ext->physics->depth, pos);
+
+ if ((p1->ext->physics->ignore_part_pos) && (p2->ext->physics->ignore_part_pos))
p3_write->ignore_part_pos = 1;
else
p3_write->ignore_part_pos = 0;
- if ((p1->physics->material) && (p2->physics->material))
- p3_write->material = p1->physics->material;
+ if ((p1->ext->physics->material) && (p2->ext->physics->material))
+ p3_write->material = p1->ext->physics->material;
else
p3_write->material = EPHYSICS_BODY_MATERIAL_CUSTOM;
- p3_write->light_on = p1->physics->light_on || p2->physics->light_on;
- p3_write->backcull = p1->physics->backcull || p2->physics->backcull;
-
- p3_write->mov_freedom.lin.x = p1->physics->mov_freedom.lin.x ||
- p2->physics->mov_freedom.lin.x;
- p3_write->mov_freedom.lin.y = p1->physics->mov_freedom.lin.y ||
- p2->physics->mov_freedom.lin.y;
- p3_write->mov_freedom.lin.z = p1->physics->mov_freedom.lin.z ||
- p2->physics->mov_freedom.lin.z;
- p3_write->mov_freedom.ang.x = p1->physics->mov_freedom.ang.x ||
- p2->physics->mov_freedom.ang.x;
- p3_write->mov_freedom.ang.y = p1->physics->mov_freedom.ang.y ||
- p2->physics->mov_freedom.ang.y;
- p3_write->mov_freedom.ang.z = p1->physics->mov_freedom.ang.z ||
- p2->physics->mov_freedom.ang.z;
+ p3_write->light_on = p1->ext->physics->light_on || p2->ext->physics->light_on;
+ p3_write->backcull = p1->ext->physics->backcull || p2->ext->physics->backcull;
+
+ p3_write->mov_freedom.lin.x = p1->ext->physics->mov_freedom.lin.x ||
+ p2->ext->physics->mov_freedom.lin.x;
+ p3_write->mov_freedom.lin.y = p1->ext->physics->mov_freedom.lin.y ||
+ p2->ext->physics->mov_freedom.lin.y;
+ p3_write->mov_freedom.lin.z = p1->ext->physics->mov_freedom.lin.z ||
+ p2->ext->physics->mov_freedom.lin.z;
+ p3_write->mov_freedom.ang.x = p1->ext->physics->mov_freedom.ang.x ||
+ p2->ext->physics->mov_freedom.ang.x;
+ p3_write->mov_freedom.ang.y = p1->ext->physics->mov_freedom.ang.y ||
+ p2->ext->physics->mov_freedom.ang.y;
+ p3_write->mov_freedom.ang.z = p1->ext->physics->mov_freedom.ang.z ||
+ p2->ext->physics->mov_freedom.ang.z;
}
EINA_COW_CALC_PHYSICS_END(p3, p3_write);
}
@@ -4402,63 +4538,68 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
switch (part_type)
{
case EDJE_PART_TYPE_IMAGE:
- p3->type.common.spec.image.l = INTP(p1->type.common.spec.image.l, p2->type.common.spec.image.l, pos);
- p3->type.common.spec.image.r = INTP(p1->type.common.spec.image.r, p2->type.common.spec.image.r, pos);
- p3->type.common.spec.image.t = INTP(p1->type.common.spec.image.t, p2->type.common.spec.image.t, pos);
- p3->type.common.spec.image.b = INTP(p1->type.common.spec.image.b, p2->type.common.spec.image.b, pos);
- p3->type.common.spec.image.border_scale_by = FFP(p1->type.common.spec.image.border_scale_by, p2->type.common.spec.image.border_scale_by, pos);
+ _edje_calc_params_need_type_common(p3);
+ p3->type.common->spec.image.l = INTP(p1->type.common->spec.image.l, p2->type.common->spec.image.l, pos);
+ p3->type.common->spec.image.r = INTP(p1->type.common->spec.image.r, p2->type.common->spec.image.r, pos);
+ p3->type.common->spec.image.t = INTP(p1->type.common->spec.image.t, p2->type.common->spec.image.t, pos);
+ p3->type.common->spec.image.b = INTP(p1->type.common->spec.image.b, p2->type.common->spec.image.b, pos);
+ p3->type.common->spec.image.border_scale_by = FFP(p1->type.common->spec.image.border_scale_by, p2->type.common->spec.image.border_scale_by, pos);
case EDJE_PART_TYPE_PROXY:
- p3->type.common.fill.x = INTP(p1->type.common.fill.x, p2->type.common.fill.x, pos);
- p3->type.common.fill.y = INTP(p1->type.common.fill.y, p2->type.common.fill.y, pos);
- p3->type.common.fill.w = INTP(p1->type.common.fill.w, p2->type.common.fill.w, pos);
- p3->type.common.fill.h = INTP(p1->type.common.fill.h, p2->type.common.fill.h, pos);
+ _edje_calc_params_need_type_common(p3);
+ p3->type.common->fill.x = INTP(p1->type.common->fill.x, p2->type.common->fill.x, pos);
+ p3->type.common->fill.y = INTP(p1->type.common->fill.y, p2->type.common->fill.y, pos);
+ p3->type.common->fill.w = INTP(p1->type.common->fill.w, p2->type.common->fill.w, pos);
+ p3->type.common->fill.h = INTP(p1->type.common->fill.h, p2->type.common->fill.h, pos);
break;
case EDJE_PART_TYPE_TEXT:
- p3->type.text.size = INTP(p1->type.text.size, p2->type.text.size, pos);
+ _edje_calc_params_need_type_text(p3);
+ p3->type.text->size = INTP(p1->type.text->size, p2->type.text->size, pos);
/* no break as we share code with the TEXTBLOCK type here. Intended fall-through */
case EDJE_PART_TYPE_TEXTBLOCK:
- p3->type.text.color2.r = INTP(p1->type.text.color2.r, p2->type.text.color2.r, pos2);
- p3->type.text.color2.g = INTP(p1->type.text.color2.g, p2->type.text.color2.g, pos2);
- p3->type.text.color2.b = INTP(p1->type.text.color2.b, p2->type.text.color2.b, pos2);
- p3->type.text.color2.a = INTP(p1->type.text.color2.a, p2->type.text.color2.a, pos2);
-
- p3->type.text.color3.r = INTP(p1->type.text.color3.r, p2->type.text.color3.r, pos2);
- p3->type.text.color3.g = INTP(p1->type.text.color3.g, p2->type.text.color3.g, pos2);
- p3->type.text.color3.b = INTP(p1->type.text.color3.b, p2->type.text.color3.b, pos2);
- p3->type.text.color3.a = INTP(p1->type.text.color3.a, p2->type.text.color3.a, pos2);
-
- p3->type.text.align.x = FFP(p1->type.text.align.x, p2->type.text.align.x, pos);
- p3->type.text.align.y = FFP(p1->type.text.align.y, p2->type.text.align.y, pos);
- p3->type.text.ellipsis = TO_DOUBLE(FINTP(p1->type.text.ellipsis, p2->type.text.ellipsis, pos2));
+ _edje_calc_params_need_type_text(p3);
+ p3->type.text->color2.r = INTP(p1->type.text->color2.r, p2->type.text->color2.r, pos2);
+ p3->type.text->color2.g = INTP(p1->type.text->color2.g, p2->type.text->color2.g, pos2);
+ p3->type.text->color2.b = INTP(p1->type.text->color2.b, p2->type.text->color2.b, pos2);
+ p3->type.text->color2.a = INTP(p1->type.text->color2.a, p2->type.text->color2.a, pos2);
+
+ p3->type.text->color3.r = INTP(p1->type.text->color3.r, p2->type.text->color3.r, pos2);
+ p3->type.text->color3.g = INTP(p1->type.text->color3.g, p2->type.text->color3.g, pos2);
+ p3->type.text->color3.b = INTP(p1->type.text->color3.b, p2->type.text->color3.b, pos2);
+ p3->type.text->color3.a = INTP(p1->type.text->color3.a, p2->type.text->color3.a, pos2);
+
+ p3->type.text->align.x = FFP(p1->type.text->align.x, p2->type.text->align.x, pos);
+ p3->type.text->align.y = FFP(p1->type.text->align.y, p2->type.text->align.y, pos);
+ p3->type.text->ellipsis = TO_DOUBLE(FINTP(p1->type.text->ellipsis, p2->type.text->ellipsis, pos2));
break;
case EDJE_PART_TYPE_MESH_NODE:
- p3->type.node.frame = INTP(p1->type.node.frame, p2->type.node.frame, pos);
- p3->type.node.data[0] = INTP(p1->type.node.data[0], p2->type.node.data[0], pos);
+ _edje_calc_params_need_type_node(p3);
+ p3->type.node->frame = INTP(p1->type.node->frame, p2->type.node->frame, pos);
+ p3->type.node->data[0] = INTP(p1->type.node->data[0], p2->type.node->data[0], pos);
- p3->type.node.point.x = FFP(p1->type.node.point.x, p2->type.node.point.x, pos);
- p3->type.node.point.y = FFP(p1->type.node.point.y, p2->type.node.point.y, pos);
- p3->type.node.point.z = FFP(p1->type.node.point.z, p2->type.node.point.z, pos);
+ p3->type.node->point.x = FFP(p1->type.node->point.x, p2->type.node->point.x, pos);
+ p3->type.node->point.y = FFP(p1->type.node->point.y, p2->type.node->point.y, pos);
+ p3->type.node->point.z = FFP(p1->type.node->point.z, p2->type.node->point.z, pos);
- p3->type.node.scale_3d.x = FFP(p1->type.node.scale_3d.x, p2->type.node.scale_3d.x, pos);
- p3->type.node.scale_3d.y = FFP(p1->type.node.scale_3d.y, p2->type.node.scale_3d.y, pos);
- p3->type.node.scale_3d.z = FFP(p1->type.node.scale_3d.z, p2->type.node.scale_3d.z, pos);
+ p3->type.node->scale_3d.x = FFP(p1->type.node->scale_3d.x, p2->type.node->scale_3d.x, pos);
+ p3->type.node->scale_3d.y = FFP(p1->type.node->scale_3d.y, p2->type.node->scale_3d.y, pos);
+ p3->type.node->scale_3d.z = FFP(p1->type.node->scale_3d.z, p2->type.node->scale_3d.z, pos);
break;
case EDJE_PART_TYPE_CAMERA:
- p3->type.node.data[0] = FFP(p1->type.node.data[0], p2->type.node.data[0], pos);
+ p3->type.node->data[0] = FFP(p1->type.node->data[0], p2->type.node->data[0], pos);
- p3->type.node.point.x = FFP(p1->type.node.point.x, p2->type.node.point.x, pos);
- p3->type.node.point.y = FFP(p1->type.node.point.y, p2->type.node.point.y, pos);
- p3->type.node.point.z = FFP(p1->type.node.point.z, p2->type.node.point.z, pos);
+ p3->type.node->point.x = FFP(p1->type.node->point.x, p2->type.node->point.x, pos);
+ p3->type.node->point.y = FFP(p1->type.node->point.y, p2->type.node->point.y, pos);
+ p3->type.node->point.z = FFP(p1->type.node->point.z, p2->type.node->point.z, pos);
break;
case EDJE_PART_TYPE_LIGHT:
- p3->type.node.data[0] = FFP(p1->type.node.data[0], p2->type.node.data[0], pos);
+ p3->type.node->data[0] = FFP(p1->type.node->data[0], p2->type.node->data[0], pos);
- p3->type.node.point.x = FFP(p1->type.node.point.x, p2->type.node.point.x, pos);
- p3->type.node.point.y = FFP(p1->type.node.point.y, p2->type.node.point.y, pos);
- p3->type.node.point.z = FFP(p1->type.node.point.z, p2->type.node.point.z, pos);
+ p3->type.node->point.x = FFP(p1->type.node->point.x, p2->type.node->point.x, pos);
+ p3->type.node->point.y = FFP(p1->type.node->point.y, p2->type.node->point.y, pos);
+ p3->type.node->point.z = FFP(p1->type.node->point.z, p2->type.node->point.z, pos);
break;
}
@@ -4474,19 +4615,22 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
p3->lighted = p3->mapped ? p1->lighted | p2->lighted : 0;
if (p3->mapped)
{
+ _edje_calc_params_need_ext(p1);
+ _edje_calc_params_need_ext(p2);
+ _edje_calc_params_need_ext(p3);
EINA_COW_CALC_MAP_BEGIN(p3, p3_write)
{
- p3_write->center.x = INTP(p1->map->center.x, p2->map->center.x, pos);
- p3_write->center.y = INTP(p1->map->center.y, p2->map->center.y, pos);
- p3_write->center.z = INTP(p1->map->center.z, p2->map->center.z, pos);
- p3_write->rotation.x = FFP(p1->map->rotation.x, p2->map->rotation.x, pos);
- p3_write->rotation.y = FFP(p1->map->rotation.y, p2->map->rotation.y, pos);
- p3_write->rotation.z = FFP(p1->map->rotation.z, p2->map->rotation.z, pos);
- p3_write->zoom.x = FFP(p1->map->zoom.x, p2->map->zoom.x, pos);
- p3_write->zoom.y = FFP(p1->map->zoom.y, p2->map->zoom.y, pos);
+ p3_write->center.x = INTP(p1->ext->map->center.x, p2->ext->map->center.x, pos);
+ p3_write->center.y = INTP(p1->ext->map->center.y, p2->ext->map->center.y, pos);
+ p3_write->center.z = INTP(p1->ext->map->center.z, p2->ext->map->center.z, pos);
+ p3_write->rotation.x = FFP(p1->ext->map->rotation.x, p2->ext->map->rotation.x, pos);
+ p3_write->rotation.y = FFP(p1->ext->map->rotation.y, p2->ext->map->rotation.y, pos);
+ p3_write->rotation.z = FFP(p1->ext->map->rotation.z, p2->ext->map->rotation.z, pos);
+ p3_write->zoom.x = FFP(p1->ext->map->zoom.x, p2->ext->map->zoom.x, pos);
+ p3_write->zoom.y = FFP(p1->ext->map->zoom.y, p2->ext->map->zoom.y, pos);
#define MIX(P1, P2, P3, pos, info) \
- P3->info = P1->map->info + TO_INT(SCALE(pos, P2->map->info - P1->map->info));
+ P3->info = P1->ext->map->info + TO_INT(SCALE(pos, P2->ext->map->info - P1->ext->map->info));
map_colors_free = _map_colors_interp(p1, p2, p3_write, pos);
if (p1->lighted && p2->lighted)
@@ -4503,11 +4647,11 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
}
else if (p1->lighted)
{
- memcpy(&p3_write->light, &p1->map->light, sizeof (p1->map->light));
+ memcpy(&p3_write->light, &p1->ext->map->light, sizeof (p1->ext->map->light));
}
else if (p2->lighted)
{
- memcpy(&p3_write->light, &p2->map->light, sizeof (p2->map->light));
+ memcpy(&p3_write->light, &p2->ext->map->light, sizeof (p2->ext->map->light));
}
if (p1->persp_on && p2->persp_on)
@@ -4519,21 +4663,18 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
}
else if (p1->persp_on)
{
- memcpy(&p3_write->persp, &p1->map->persp, sizeof (p1->map->persp));
+ memcpy(&p3_write->persp, &p1->ext->map->persp, sizeof (p1->ext->map->persp));
}
else if (p2->persp_on)
{
- memcpy(&p3_write->persp, &p2->map->persp, sizeof (p2->map->persp));
+ memcpy(&p3_write->persp, &p2->ext->map->persp, sizeof (p2->ext->map->persp));
}
}
EINA_COW_CALC_MAP_END(p3, p3_write);
}
#ifndef EDJE_CALC_CACHE
- eina_cow_free(_edje_calc_params_map_cow, (const Eina_Cow_Data **)&lp2.map);
-#ifdef HAVE_EPHYSICS
- eina_cow_free(_edje_calc_params_physics_cow, (const Eina_Cow_Data **)&lp2.physics);
-#endif
+ _edje_calc_params_clear(&lp2);
#endif
pf = p3;
}
@@ -4586,26 +4727,36 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
if (state)
{
+ Eina_Bool needext = EINA_FALSE;
const Edje_Calc_Params_Map *map;
#ifdef HAVE_EPHYSICS
const Edje_Calc_Params_Physics *physics;
#endif
- map = state->map;
+ if (state->ext)
+ {
+ needext = EINA_TRUE;
+ map = state->ext->map;
#ifdef HAVE_EPHYSICS
- physics = state->physics;
+ physics = state->ext->physics;
#endif
+ }
- memcpy(state, pf, sizeof (Edje_Calc_Params));
+ _edje_part_calc_params_memcpy(state, pf, ep->part->type);
- state->map = map;
+ if (needext)
+ {
+ state->ext = NULL;
+ _edje_calc_params_need_ext(state);
+ state->ext->map = map;
#ifdef HAVE_EPHYSICS
- state->physics = physics;
+ state->ext->physics = physics;
#endif
- eina_cow_memcpy(_edje_calc_params_map_cow, (const Eina_Cow_Data **)&state->map, pf->map);
+ eina_cow_memcpy(_edje_calc_params_map_cow, (const Eina_Cow_Data **)&state->ext->map, pf->ext->map);
#ifdef HAVE_EPHYSICS
- eina_cow_memcpy(_edje_calc_params_physics_cow, (const Eina_Cow_Data **)&state->physics, pf->physics);
+ eina_cow_memcpy(_edje_calc_params_physics_cow, (const Eina_Cow_Data **)&state->ext->physics, pf->ext->physics);
#endif
+ }
}
ep->req = pf->req;
@@ -4701,7 +4852,10 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
if (((ep->prev_description) &&
(chosen_desc != ep->prev_description)) ||
(pf != p1))
- _edje_physics_body_props_update(ed, ep, pf, !pf->physics->ignore_part_pos);
+ {
+ _edje_calc_params_need_ext(pf);
+ _edje_physics_body_props_update(ed, ep, pf, !pf->ext->physics->ignore_part_pos);
+ }
}
else
efl_gfx_position_set(ep->object, ed->x + pf->final.x, ed->y + pf->final.y);
@@ -4719,8 +4873,8 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
_edje_entry_real_part_configure(ed, ep);
/* handle clip overrides */
- if (pf->clip_to && pf->clip_to->object)
- evas_object_clip_set(ep->object, pf->clip_to->object);
+ if ((pf->ext) && (pf->ext->clip_to) && (pf->ext->clip_to->object))
+ evas_object_clip_set(ep->object, pf->ext->clip_to->object);
else if (ep->part->clip_to_id >= 0)
evas_object_clip_set(ep->object, ed->table_parts[ep->part->clip_to_id % ed->table_parts_size]->object);
else
@@ -4764,7 +4918,8 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
evas_canvas3d_camera_projection_perspective_set(camera, pd_camera->camera.camera.fovy, pd_camera->camera.camera.aspect, pd_camera->camera.camera.frustum_near, pd_camera->camera.camera.frustum_far);
- evas_canvas3d_node_position_set(ep->node, pf->type.node.point.x, pf->type.node.point.y, pf->type.node.point.z);
+ _edje_calc_params_need_type_node(pf);
+ evas_canvas3d_node_position_set(ep->node, pf->type.node->point.x, pf->type.node->point.y, pf->type.node->point.z);
switch (pd_camera->camera.orientation.type)
{
case EVAS_CANVAS3D_NODE_ORIENTATION_TYPE_NONE:
@@ -4801,7 +4956,8 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
evas_canvas3d_light_directional_set(light_node, EINA_TRUE);
evas_canvas3d_light_projection_perspective_set(light_node, pd_light->light.light.fovy, pd_light->light.light.aspect, pd_light->light.light.frustum_near, pd_light->light.light.frustum_far);
- evas_canvas3d_node_position_set(ep->node, pf->type.node.point.x, pf->type.node.point.y, pf->type.node.point.z);
+ _edje_calc_params_need_type_node(pf);
+ evas_canvas3d_node_position_set(ep->node, pf->type.node->point.x, pf->type.node->point.y, pf->type.node->point.z);
switch (pd_light->light.orientation.type)
{
case EVAS_CANVAS3D_NODE_ORIENTATION_TYPE_NONE:
@@ -4862,10 +5018,11 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
primitive = eo_add(EVAS_CANVAS3D_PRIMITIVE_CLASS, ed->base->evas);
evas_canvas3d_primitive_form_set(primitive, pd_mesh_node->mesh_node.mesh.primitive);
- frame_exist = evas_canvas3d_mesh_frame_exist(mesh, pf->type.node.frame);
+ _edje_calc_params_need_type_node(pf);
+ frame_exist = evas_canvas3d_mesh_frame_exist(mesh, pf->type.node->frame);
if (!frame_exist)
{
- evas_canvas3d_mesh_frame_material_set(mesh, pf->type.node.frame, material);
+ evas_canvas3d_mesh_frame_material_set(mesh, pf->type.node->frame, material);
}
evas_canvas3d_mesh_from_primitive_set(mesh, 0, primitive);
break;
@@ -4892,17 +5049,18 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
}
}
- frame_exist = evas_canvas3d_mesh_frame_exist(mesh, pf->type.node.frame);
+ _edje_calc_params_need_type_node(pf);
+ frame_exist = evas_canvas3d_mesh_frame_exist(mesh, pf->type.node->frame);
if (!frame_exist)
{
- evas_canvas3d_mesh_frame_add(mesh, pf->type.node.frame);
- evas_canvas3d_mesh_frame_material_set(mesh, pf->type.node.frame, material);
+ evas_canvas3d_mesh_frame_add(mesh, pf->type.node->frame);
+ evas_canvas3d_mesh_frame_material_set(mesh, pf->type.node->frame, material);
}
evas_canvas3d_mesh_shader_mode_set(mesh, pd_mesh_node->mesh_node.properties.shade);
evas_canvas3d_mesh_vertex_assembly_set(mesh, pd_mesh_node->mesh_node.mesh.assembly);
- evas_canvas3d_node_mesh_frame_set(ep->node, mesh, pf->type.node.frame);
- evas_canvas3d_node_scale_set(ep->node, pf->type.node.scale_3d.x, pf->type.node.scale_3d.y, pf->type.node.scale_3d.z);
- evas_canvas3d_node_position_set(ep->node, pf->type.node.point.x, pf->type.node.point.y, pf->type.node.point.z);
+ evas_canvas3d_node_mesh_frame_set(ep->node, mesh, pf->type.node->frame);
+ evas_canvas3d_node_scale_set(ep->node, pf->type.node->scale_3d.x, pf->type.node->scale_3d.y, pf->type.node->scale_3d.z);
+ evas_canvas3d_node_position_set(ep->node, pf->type.node->point.x, pf->type.node->point.y, pf->type.node->point.z);
switch (pd_mesh_node->mesh_node.orientation.type)
{
case EVAS_CANVAS3D_NODE_ORIENTATION_TYPE_NONE:
@@ -4980,8 +5138,8 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
(ep->typedata.swallow)) &&
(ep->typedata.swallow->swallowed_object))
{
- if (pf->clip_to && pf->clip_to->object)
- evas_object_clip_set(ep->typedata.swallow->swallowed_object, pf->clip_to->object);
+ if ((pf->ext) && (pf->ext->clip_to) && (pf->ext->clip_to->object))
+ evas_object_clip_set(ep->typedata.swallow->swallowed_object, pf->ext->clip_to->object);
else if (ep->part->clip_to_id >= 0)
evas_object_clip_set(ep->typedata.swallow->swallowed_object, ed->table_parts[ep->part->clip_to_id % ed->table_parts_size]->object);
else
@@ -5065,12 +5223,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
if (pf == &lp3)
{
- eina_cow_free(_edje_calc_params_map_cow, (const Eina_Cow_Data **)&lp3.map);
- lp3.map = NULL;
-#ifdef HAVE_EPHYSICS
- eina_cow_free(_edje_calc_params_physics_cow, (const Eina_Cow_Data **)&lp3.physics);
- lp3.physics = NULL;
-#endif
+ _edje_calc_params_clear(&lp3);
}
#ifdef EDJE_CALC_CACHE
@@ -5080,9 +5233,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
ep->invalidate = EINA_FALSE;
}
#else
- eina_cow_free(_edje_calc_params_map_cow, (const Eina_Cow_Data **)&lp1.map);
-#ifdef HAVE_EPHYSICS
- eina_cow_free(_edje_calc_params_physics_cow, (const Eina_Cow_Data **)&lp1.physics);
-#endif
+ _edje_calc_params_clear(&lp1);
#endif
+
}
diff --git a/src/lib/edje/edje_embryo.c b/src/lib/edje/edje_embryo.c
index f7eeab68c9..1b899d71e9 100644
--- a/src/lib/edje/edje_embryo.c
+++ b/src/lib/edje/edje_embryo.c
@@ -2123,11 +2123,6 @@ case EDJE_PART_TYPE_##Short: \
memset(rp->custom, 0, sizeof (Edje_Real_Part_State));
- rp->custom->p.map = eina_cow_alloc(_edje_calc_params_map_cow);
-#ifdef HAVE_EPHYSICS
- rp->custom->p.physics = eina_cow_alloc(_edje_calc_params_physics_cow);
-#endif
-
*d = *parent;
d->state.name = (char *)eina_stringshare_add("custom");
diff --git a/src/lib/edje/edje_load.c b/src/lib/edje/edje_load.c
index e0e21d3a81..cf6b1bf655 100644
--- a/src/lib/edje/edje_load.c
+++ b/src/lib/edje/edje_load.c
@@ -704,11 +704,6 @@ _edje_object_file_set_internal(Evas_Object *obj, const Eina_File *file, const ch
memset(rp, 0, sizeof (Edje_Real_Part));
- rp->param1.p.map = eina_cow_alloc(_edje_calc_params_map_cow);
-#ifdef HAVE_EPHYSICS
- rp->param1.p.physics = eina_cow_alloc(_edje_calc_params_physics_cow);
-#endif
-
if ((ep->dragable.x != 0) || (ep->dragable.y != 0))
{
rp->drag = calloc(1, sizeof (Edje_Real_Part_Drag));
@@ -1724,9 +1719,8 @@ _edje_file_del(Edje *ed)
{
free(rp->param2->set);
rp->param2->set = NULL;
- eina_cow_free(_edje_calc_params_map_cow, (const Eina_Cow_Data **)&rp->param2->p.map);
-#ifdef HAVE_EPHYSICS
- eina_cow_free(_edje_calc_params_physics_cow, (const Eina_Cow_Data **)&rp->param2->p.physics);
+#ifdef EDJE_CALC_CACHE
+ _edje_calc_params_clear(&(rp->param2->p));
#endif
}
eina_mempool_free(_edje_real_part_state_mp, rp->param2);
@@ -1735,26 +1729,23 @@ _edje_file_del(Edje *ed)
{
free(rp->custom->set);
rp->custom->set = NULL;
- eina_cow_free(_edje_calc_params_map_cow, (const Eina_Cow_Data **)&rp->custom->p.map);
-#ifdef HAVE_EPHYSICS
- eina_cow_free(_edje_calc_params_physics_cow, (const Eina_Cow_Data **)&rp->custom->p.physics);
+#ifdef EDJE_CALC_CACHE
+ _edje_calc_params_clear(&(rp->custom->p));
#endif
}
eina_mempool_free(_edje_real_part_state_mp, rp->custom);
if (rp->current)
{
- eina_cow_free(_edje_calc_params_map_cow, (const Eina_Cow_Data **)&rp->current->map);
-#ifdef HAVE_EPHYSICS
- eina_cow_free(_edje_calc_params_physics_cow, (const Eina_Cow_Data **)&rp->current->physics);
+#ifdef EDJE_CALC_CACHE
+ _edje_calc_params_clear(rp->current);
#endif
free(rp->current);
rp->current = NULL;
}
_edje_unref(ed);
- eina_cow_free(_edje_calc_params_map_cow, (const Eina_Cow_Data **)&rp->param1.p.map);
-#ifdef HAVE_EPHYSICS
- eina_cow_free(_edje_calc_params_physics_cow, (const Eina_Cow_Data **)&rp->param1.p.physics);
+#ifdef EDJE_CALC_CACHE
+ _edje_calc_params_clear(&(rp->param1.p));
#endif
eina_mempool_free(_edje_real_part_mp, rp);
ed->table_parts[i] = NULL;
diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h
index 31db5f00a7..b97c7e518a 100644
--- a/src/lib/edje/edje_private.h
+++ b/src/lib/edje/edje_private.h
@@ -1794,52 +1794,71 @@ struct _Edje_Calc_Params_Physics
unsigned char ignore_part_pos; //1
};
+typedef struct _Edje_Calc_Params_Type_Common Edje_Calc_Params_Type_Common;
+typedef struct _Edje_Calc_Params_Type_Text Edje_Calc_Params_Type_Text;
+typedef struct _Edje_Calc_Params_Type_Node Edje_Calc_Params_Type_Node;
+
+struct _Edje_Calc_Params_Type_Common
+{
+ struct {
+ int x, y, w, h; // 16
+ } fill; // 16
+ union {
+ struct {
+ unsigned short l, r, t, b; // 8
+ FLOAT_T border_scale_by; // 8
+ } image; // 16
+ } spec; // 16
+}; // 32
+
+struct _Edje_Calc_Params_Type_Text
+{
+ Edje_Alignment align; /* text alignment within bounds */ // 16
+ double ellipsis; // 8
+ int size; // 4
+ Edje_Color color2, color3; // 8
+}; // 36
+
+struct _Edje_Calc_Params_Type_Node
+{
+ FLOAT_T data[6]; // 48
+ Edje_3D_Vec point; // 24
+ Edje_3D_Vec scale_3d; // 24
+ int frame; // 4
+}; // 100
+
+typedef struct _Edje_Calc_Params_Ext Edje_Calc_Params_Ext;
+
+struct _Edje_Calc_Params_Ext
+{
+ Edje_Rectangle req_drag; // 16
+ const Edje_Calc_Params_Map *map; // 4/8
+#ifdef HAVE_EPHYSICS
+ const Edje_Calc_Params_Physics *physics; // 4/8
+#endif
+ Edje_Real_Part *clip_to; /* clip override @since 1.15 */ // 4/8
+};
+
struct _Edje_Calc_Params
{
+ union {
+ Edje_Calc_Params_Type_Common *common;
+ Edje_Calc_Params_Type_Text *text;
+ Edje_Calc_Params_Type_Node *node;
+ } type; // 4/8
+ Edje_Calc_Params_Ext *ext; // 4/8
struct {
FLOAT_T x, y, w, h; // 32
} eval;
Edje_Rectangle final; // 16
Edje_Rectangle req; // 16
- Edje_Rectangle req_drag; // 16
Edje_Color color; // 4
- union {
- struct {
- struct {
- int x, y, w, h; // 16
- } fill; // 16
-
- union {
- struct {
- unsigned short l, r, t, b; // 8
- FLOAT_T border_scale_by; // 8
- } image; // 16
- } spec; // 16
- } common; // 32
- struct {
- Edje_Alignment align; /* text alignment within bounds */ // 16
- double ellipsis; // 8
- int size; // 4
- Edje_Color color2, color3; // 8
- } text; // 36
- struct {
- FLOAT_T data[6]; // 48
- Edje_3D_Vec point; // 24
- Edje_3D_Vec scale_3d; // 24
- int frame; // 4
- } node; // 100
- } type; // 100
- const Edje_Calc_Params_Map *map; // 4/8
-#ifdef HAVE_EPHYSICS
- const Edje_Calc_Params_Physics *physics; // 4/8
-#endif
- Edje_Real_Part *clip_to; /* state clip override @since 1.15 */ // 4/8
unsigned char persp_on : 1;
unsigned char lighted : 1;
unsigned char mapped : 1;
unsigned char visible : 1;
unsigned char smooth : 1; // 1
-}; // 197/209(rounded up for alignment: 200/212)
+}; // 77/85(rounded up for alignment: 80/88)
struct _Edje_Real_Part_Set
{
@@ -2321,6 +2340,42 @@ EAPI extern Eina_Mempool *_emp_SNAPSHOT;
EAPI extern Eina_Mempool *_emp_part;
EAPI extern Eina_Mempool *_emp_VECTOR;
+static inline void
+_edje_calc_params_need_type_common(Edje_Calc_Params *p)
+{
+ if (p->type.common) return;
+ p->type.common = calloc(1, sizeof(Edje_Calc_Params_Type_Common));
+}
+
+static inline void
+_edje_calc_params_need_type_text(Edje_Calc_Params *p)
+{
+ if (p->type.text) return;
+ p->type.text = calloc(1, sizeof(Edje_Calc_Params_Type_Text));
+}
+
+static inline void
+_edje_calc_params_need_type_node(Edje_Calc_Params *p)
+{
+ if (p->type.node) return;
+ p->type.node = calloc(1, sizeof(Edje_Calc_Params_Type_Node));
+}
+
+static inline void
+_edje_calc_params_need_ext(Edje_Calc_Params *p)
+{
+ if (p->ext) return;
+ p->ext = calloc(1, sizeof(Edje_Calc_Params_Ext));
+ if (!p->ext) return;
+#ifdef EDJE_CALC_CACHE
+ p->ext->map = eina_cow_alloc(_edje_calc_params_map_cow);
+# ifdef HAVE_EPHYSICS
+ p->ext->physics = eina_cow_alloc(_edje_calc_params_physics_cow);
+# endif
+#endif
+}
+
+void _edje_calc_params_clear(Edje_Calc_Params *p);
void _edje_part_pos_set(Edje *ed, Edje_Real_Part *ep, int mode, FLOAT_T pos, FLOAT_T v1, FLOAT_T v2, FLOAT_T v3, FLOAT_T v4);
/** Find the description of the part by state name and state value.
diff --git a/src/lib/edje/edje_program.c b/src/lib/edje/edje_program.c
index 1e3c6bddc4..7cb6222423 100644
--- a/src/lib/edje/edje_program.c
+++ b/src/lib/edje/edje_program.c
@@ -681,17 +681,12 @@ _edje_program_run(Edje *ed, Edje_Program *pr, Eina_Bool force, const char *ssig,
tmp = calloc(1, sizeof(Edje_Calc_Params));
if (!tmp) goto low_mem_current;
- tmp->map = eina_cow_alloc(_edje_calc_params_map_cow);
-#ifdef HAVE_EPHYSICS
- tmp->physics = eina_cow_alloc(_edje_calc_params_physics_cow);
-#endif
_edje_part_recalc(ed, rp, FLAG_XY, tmp);
if (rp->current)
{
- eina_cow_free(_edje_calc_params_map_cow, (const Eina_Cow_Data **)&rp->current->map);
-#ifdef HAVE_EPHYSICS
- eina_cow_free(_edje_calc_params_physics_cow, (const Eina_Cow_Data **)&rp->current->physics);
+#ifdef EDJE_CALC_CACHE
+ _edje_calc_params_clear(rp->current);
#endif
free(rp->current);
}
@@ -702,9 +697,8 @@ _edje_program_run(Edje *ed, Edje_Program *pr, Eina_Bool force, const char *ssig,
low_mem_current:
if (rp->current)
{
- eina_cow_free(_edje_calc_params_map_cow, (const Eina_Cow_Data **)&rp->current->map);
-#ifdef HAVE_EPHYSICS
- eina_cow_free(_edje_calc_params_physics_cow, (const Eina_Cow_Data **)&rp->current->physics);
+#ifdef EDJE_CALC_CACHE
+ _edje_calc_params_clear(rp->current);
#endif
free(rp->current);
}
diff --git a/src/lib/edje/edje_text.c b/src/lib/edje/edje_text.c
index d65f0a917b..f622714274 100644
--- a/src/lib/edje/edje_text.c
+++ b/src/lib/edje/edje_text.c
@@ -130,12 +130,13 @@ _edje_text_fit_x(Edje *ed, Edje_Real_Part *ep,
*free_text = 0;
if (sw <= 1) return "";
- if ((params->type.text.ellipsis < 0) || (chosen_desc->text.min_x))
+ _edje_calc_params_need_type_text(params);
+ if ((params->type.text->ellipsis < 0) || (chosen_desc->text.min_x))
return text;
if (ep->part->scale) evas_object_scale_set(ep->object, TO_DOUBLE(sc));
- evas_obj_text_ellipsis_set(ep->object, params->type.text.ellipsis);
+ evas_obj_text_ellipsis_set(ep->object, params->type.text->ellipsis);
efl_text_properties_font_set(ep->object, font, size);
efl_text_set(ep->object, text);
efl_gfx_size_set(ep->object, sw, sh);
@@ -293,8 +294,9 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
sw = TO_INT(params->eval.w);
sh = TO_INT(params->eval.h);
- if (params->type.text.size)
- size = params->type.text.size;
+ _edje_calc_params_need_type_text(params);
+ if (params->type.text->size)
+ size = params->type.text->size;
if (!text) text = "";
if ((text == ep->typedata.text->cache.in_str)
@@ -309,9 +311,9 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
(ep->typedata.text->cache.in_h == sh) &&
(ep->typedata.text->cache.in_str) &&
same_text &&
- (ep->typedata.text->cache.align_x == params->type.text.align.x) &&
- (ep->typedata.text->cache.align_y == params->type.text.align.y) &&
- (ep->typedata.text->cache.ellipsis == params->type.text.ellipsis) &&
+ (ep->typedata.text->cache.align_x == params->type.text->align.x) &&
+ (ep->typedata.text->cache.align_y == params->type.text->align.y) &&
+ (ep->typedata.text->cache.ellipsis == params->type.text->ellipsis) &&
(ep->typedata.text->cache.fit_x == chosen_desc->text.fit_x) &&
(ep->typedata.text->cache.fit_y == chosen_desc->text.fit_y) &&
(ep->typedata.text->cache.in_font == font))
@@ -465,7 +467,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
else if ((ed->file->version >= 3) && (ed->file->minor >= 6))
{
evas_object_text_ellipsis_set(ep->object,
- params->type.text.ellipsis);
+ params->type.text->ellipsis);
}
eina_stringshare_replace(&ep->typedata.text->cache.out_str, text);
@@ -473,9 +475,9 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
ep->typedata.text->cache.in_h = sh;
ep->typedata.text->cache.in_font = font;
ep->typedata.text->cache.out_size = size;
- ep->typedata.text->cache.align_x = params->type.text.align.x;
- ep->typedata.text->cache.align_y = params->type.text.align.y;
- ep->typedata.text->cache.ellipsis = params->type.text.ellipsis;
+ ep->typedata.text->cache.align_x = params->type.text->align.x;
+ ep->typedata.text->cache.align_y = params->type.text->align.y;
+ ep->typedata.text->cache.ellipsis = params->type.text->ellipsis;
ep->typedata.text->cache.fit_x = chosen_desc->text.fit_x;
ep->typedata.text->cache.fit_y = chosen_desc->text.fit_y;
arrange_text:
@@ -492,7 +494,7 @@ arrange_text:
/* Handle alignment */
{
FLOAT_T align_x;
- if (params->type.text.align.x < FROM_INT(0))
+ if (params->type.text->align.x < FROM_INT(0))
{
if (evas_object_text_direction_get(ep->object) ==
EVAS_BIDI_DIRECTION_RTL)
@@ -506,10 +508,10 @@ arrange_text:
}
else
{
- align_x = params->type.text.align.x;
+ align_x = params->type.text->align.x;
}
ep->typedata.text->offset.x = TO_INT(SCALE(align_x, (sw - tw)));
- ep->typedata.text->offset.y = TO_INT(SCALE(params->type.text.align.y, (sh - th)));
+ ep->typedata.text->offset.y = TO_INT(SCALE(params->type.text->align.y, (sh - th)));
}
if (!calc_only)
@@ -540,73 +542,73 @@ arrange_text:
case EDJE_TEXT_EFFECT_OUTLINE:
style = EVAS_TEXT_STYLE_OUTLINE;
evas_object_text_outline_color_set(ep->object,
- (params->type.text.color2.r * params->type.text.color2.a) / 255,
- (params->type.text.color2.g * params->type.text.color2.a) / 255,
- (params->type.text.color2.b * params->type.text.color2.a) / 255,
- params->type.text.color2.a);
+ (params->type.text->color2.r * params->type.text->color2.a) / 255,
+ (params->type.text->color2.g * params->type.text->color2.a) / 255,
+ (params->type.text->color2.b * params->type.text->color2.a) / 255,
+ params->type.text->color2.a);
break;
case EDJE_TEXT_EFFECT_SOFT_OUTLINE:
style = EVAS_TEXT_STYLE_SOFT_OUTLINE;
evas_object_text_outline_color_set(ep->object,
- (params->type.text.color2.r * params->type.text.color2.a) / 255,
- (params->type.text.color2.g * params->type.text.color2.a) / 255,
- (params->type.text.color2.b * params->type.text.color2.a) / 255,
- params->type.text.color2.a);
+ (params->type.text->color2.r * params->type.text->color2.a) / 255,
+ (params->type.text->color2.g * params->type.text->color2.a) / 255,
+ (params->type.text->color2.b * params->type.text->color2.a) / 255,
+ params->type.text->color2.a);
break;
case EDJE_TEXT_EFFECT_SHADOW:
style = EVAS_TEXT_STYLE_SHADOW;
evas_object_text_shadow_color_set(ep->object,
- (params->type.text.color3.r * params->type.text.color3.a) / 255,
- (params->type.text.color3.g * params->type.text.color3.a) / 255,
- (params->type.text.color3.b * params->type.text.color3.a) / 255,
- params->type.text.color3.a);
+ (params->type.text->color3.r * params->type.text->color3.a) / 255,
+ (params->type.text->color3.g * params->type.text->color3.a) / 255,
+ (params->type.text->color3.b * params->type.text->color3.a) / 255,
+ params->type.text->color3.a);
break;
case EDJE_TEXT_EFFECT_SOFT_SHADOW:
style = EVAS_TEXT_STYLE_SOFT_SHADOW;
evas_object_text_shadow_color_set(ep->object,
- (params->type.text.color3.r * params->type.text.color3.a) / 255,
- (params->type.text.color3.g * params->type.text.color3.a) / 255,
- (params->type.text.color3.b * params->type.text.color3.a) / 255,
- params->type.text.color3.a);
+ (params->type.text->color3.r * params->type.text->color3.a) / 255,
+ (params->type.text->color3.g * params->type.text->color3.a) / 255,
+ (params->type.text->color3.b * params->type.text->color3.a) / 255,
+ params->type.text->color3.a);
break;
case EDJE_TEXT_EFFECT_OUTLINE_SHADOW:
style = EVAS_TEXT_STYLE_OUTLINE_SHADOW;
- evas_obj_text_outline_color_set(ep->object, (params->type.text.color2.r * params->type.text.color2.a) / 255, (params->type.text.color2.g * params->type.text.color2.a) / 255, (params->type.text.color2.b * params->type.text.color2.a) / 255, params->type.text.color2.a);
- evas_obj_text_shadow_color_set(ep->object, (params->type.text.color3.r * params->type.text.color3.a) / 255, (params->type.text.color3.g * params->type.text.color3.a) / 255, (params->type.text.color3.b * params->type.text.color3.a) / 255, params->type.text.color3.a);
+ evas_obj_text_outline_color_set(ep->object, (params->type.text->color2.r * params->type.text->color2.a) / 255, (params->type.text->color2.g * params->type.text->color2.a) / 255, (params->type.text->color2.b * params->type.text->color2.a) / 255, params->type.text->color2.a);
+ evas_obj_text_shadow_color_set(ep->object, (params->type.text->color3.r * params->type.text->color3.a) / 255, (params->type.text->color3.g * params->type.text->color3.a) / 255, (params->type.text->color3.b * params->type.text->color3.a) / 255, params->type.text->color3.a);
break;
case EDJE_TEXT_EFFECT_OUTLINE_SOFT_SHADOW:
style = EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW;
- evas_obj_text_outline_color_set(ep->object, (params->type.text.color2.r * params->type.text.color2.a) / 255, (params->type.text.color2.g * params->type.text.color2.a) / 255, (params->type.text.color2.b * params->type.text.color2.a) / 255, params->type.text.color2.a);
- evas_obj_text_shadow_color_set(ep->object, (params->type.text.color3.r * params->type.text.color3.a) / 255, (params->type.text.color3.g * params->type.text.color3.a) / 255, (params->type.text.color3.b * params->type.text.color3.a) / 255, params->type.text.color3.a);
+ evas_obj_text_outline_color_set(ep->object, (params->type.text->color2.r * params->type.text->color2.a) / 255, (params->type.text->color2.g * params->type.text->color2.a) / 255, (params->type.text->color2.b * params->type.text->color2.a) / 255, params->type.text->color2.a);
+ evas_obj_text_shadow_color_set(ep->object, (params->type.text->color3.r * params->type.text->color3.a) / 255, (params->type.text->color3.g * params->type.text->color3.a) / 255, (params->type.text->color3.b * params->type.text->color3.a) / 255, params->type.text->color3.a);
break;
case EDJE_TEXT_EFFECT_FAR_SHADOW:
style = EVAS_TEXT_STYLE_FAR_SHADOW;
evas_object_text_shadow_color_set(ep->object,
- (params->type.text.color3.r * params->type.text.color3.a) / 255,
- (params->type.text.color3.g * params->type.text.color3.a) / 255,
- (params->type.text.color3.b * params->type.text.color3.a) / 255,
- params->type.text.color3.a);
+ (params->type.text->color3.r * params->type.text->color3.a) / 255,
+ (params->type.text->color3.g * params->type.text->color3.a) / 255,
+ (params->type.text->color3.b * params->type.text->color3.a) / 255,
+ params->type.text->color3.a);
break;
case EDJE_TEXT_EFFECT_FAR_SOFT_SHADOW:
style = EVAS_TEXT_STYLE_FAR_SOFT_SHADOW;
evas_object_text_shadow_color_set(ep->object,
- (params->type.text.color3.r * params->type.text.color3.a) / 255,
- (params->type.text.color3.g * params->type.text.color3.a) / 255,
- (params->type.text.color3.b * params->type.text.color3.a) / 255,
- params->type.text.color3.a);
+ (params->type.text->color3.r * params->type.text->color3.a) / 255,
+ (params->type.text->color3.g * params->type.text->color3.a) / 255,
+ (params->type.text->color3.b * params->type.text->color3.a) / 255,
+ params->type.text->color3.a);
break;
case EDJE_TEXT_EFFECT_GLOW:
style = EVAS_TEXT_STYLE_GLOW;
- evas_obj_text_glow_color_set(ep->object, (params->type.text.color2.r * params->type.text.color2.a) / 255, (params->type.text.color2.g * params->type.text.color2.a) / 255, (params->type.text.color2.b * params->type.text.color2.a) / 255, params->type.text.color2.a);
- evas_obj_text_glow2_color_set(ep->object, (params->type.text.color3.r * params->type.text.color3.a) / 255, (params->type.text.color3.g * params->type.text.color3.a) / 255, (params->type.text.color3.b * params->type.text.color3.a) / 255, params->type.text.color3.a);
+ evas_obj_text_glow_color_set(ep->object, (params->type.text->color2.r * params->type.text->color2.a) / 255, (params->type.text->color2.g * params->type.text->color2.a) / 255, (params->type.text->color2.b * params->type.text->color2.a) / 255, params->type.text->color2.a);
+ evas_obj_text_glow2_color_set(ep->object, (params->type.text->color3.r * params->type.text->color3.a) / 255, (params->type.text->color3.g * params->type.text->color3.a) / 255, (params->type.text->color3.b * params->type.text->color3.a) / 255, params->type.text->color3.a);
break;
default: