summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>2016-08-14 22:30:32 +0900
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>2016-08-15 09:21:08 +0900
commit1d6a58cfc9f3bbe821eb04150e2b1e0ede7b32eb (patch)
tree6dc7780ff3d013ded3491a87149cd15bc20d12a5 /src
parenta5232bb2839df9594e0bb3d810d3fc2ad24cb463 (diff)
downloadefl-1d6a58cfc9f3bbe821eb04150e2b1e0ede7b32eb.tar.gz
edje - save memory on edje parts as a lot of over-allocation was done
so ... Edje_Calc_Params was huge ... like about 200 bytes. every part in every live edje object got one of these in addtion to real part struct info etc. ... so really every part was probably consuming 300-500 bytes or so... crazy. so i made a lot of the data now optional so only the minimum required is allocated now which cuts down about 110 or even 120 bytes per part, depending. 100 bytes was needed for 3d node parts even though almsot no parts are 3d node parts... the image and text data was 30-40 bytes so we consumed 100 even if we only used 30-40... so this cuts that done and puts in polace calc param cleanup funcs everywhere they are needed to clean up this extra allocated data. i also reduced this even more by maping pointers to req_drag, map and physics and clip_to fields in another extension struct cutting down another 28/52 bytes on most parts (in return for an added 4/8 bytes - on 32/64bit accordingly). in elementary_test this saves about ~300kb of ram for just having the etst run and displaying (peak memory measuremment). so massif says 10.6M -> 10.3M. @optimize
Diffstat (limited to 'src')
-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: