* edje_calc: Major cleanup.

- Edje_Real_Part use less memory.
		- Edje_Real_Part and Edje_Real_Part_State now use a mempool.
		- When both param1 and param2 are the same, only recalc param1.
		- Don't compute Edje_Real_Part more than one time per edje_recalc_do.



SVN revision: 41771
This commit is contained in:
Cedric BAIL 2009-08-14 17:19:42 +00:00
parent 3d6840cd1a
commit 7df190d264
6 changed files with 325 additions and 225 deletions

View File

@ -65,7 +65,7 @@ _edje_part_description_find(Edje *ed, Edje_Real_Part *rp, const char *name,
return ep->default_desc;
if (!strcmp(name, "custom"))
return rp->custom.description;
return rp->custom ? rp->custom->description : NULL;
if (!strcmp(name, "default"))
{
@ -93,14 +93,32 @@ _edje_part_description_find(Edje *ed, Edje_Real_Part *rp, const char *name,
void
_edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char *d1, double v1, const char *d2, double v2)
{
Edje_Part_Description *epd1;
Edje_Part_Description *epd2;
if (!d1) d1 = "default";
if (!d2) d2 = "default";
ep->param1.description = _edje_part_description_find(ed, ep, d1, v1);
if (!ep->param1.description)
ep->param1.description = ep->part->default_desc; /* never NULL */
epd1 = _edje_part_description_find(ed, ep, d1, v1);
if (!epd1)
epd1 = ep->part->default_desc; /* never NULL */
ep->param2.description = _edje_part_description_find(ed, ep, d2, v2);
epd2 = _edje_part_description_find(ed, ep, d2, v2);
if (epd2 != NULL && epd1 != epd2)
{
if (!ep->param2)
ep->param2 = eina_mempool_malloc(_edje_real_part_state_mp, sizeof (Edje_Real_Part_State));
}
else
if (ep->param2)
{
eina_mempool_free(_edje_real_part_state_mp, ep->param2);
ep->param2 = NULL;
}
ep->param1.description = epd1;
ep->chosen_description = epd1;
ep->param1.rel1_to_x = ep->param1.rel1_to_y = NULL;
ep->param1.rel2_to_x = ep->param1.rel2_to_y = NULL;
@ -114,25 +132,28 @@ _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char *d1, doubl
if (ep->param1.description->rel2.id_y >= 0)
ep->param1.rel2_to_y = ed->table_parts[ep->param1.description->rel2.id_y % ed->table_parts_size];
ep->param2.rel1_to_x = ep->param2.rel1_to_y = NULL;
ep->param2.rel2_to_x = ep->param2.rel2_to_y = NULL;
if (ep->param2.description)
if (ep->param2)
{
if (ep->param2.description->rel1.id_x >= 0)
ep->param2.rel1_to_x = ed->table_parts[ep->param2.description->rel1.id_x % ed->table_parts_size];
if (ep->param2.description->rel1.id_y >= 0)
ep->param2.rel1_to_y = ed->table_parts[ep->param2.description->rel1.id_y % ed->table_parts_size];
if (ep->param2.description->rel2.id_x >= 0)
ep->param2.rel2_to_x = ed->table_parts[ep->param2.description->rel2.id_x % ed->table_parts_size];
if (ep->param2.description->rel2.id_y >= 0)
ep->param2.rel2_to_y = ed->table_parts[ep->param2.description->rel2.id_y % ed->table_parts_size];
}
ep->param2->description = epd2;
if (ep->description_pos == 0.0)
ep->chosen_description = ep->param1.description;
else
ep->chosen_description = ep->param2.description;
ep->param2->rel1_to_x = ep->param2->rel1_to_y = NULL;
ep->param2->rel2_to_x = ep->param2->rel2_to_y = NULL;
if (ep->param2->description)
{
if (ep->param2->description->rel1.id_x >= 0)
ep->param2->rel1_to_x = ed->table_parts[ep->param2->description->rel1.id_x % ed->table_parts_size];
if (ep->param2->description->rel1.id_y >= 0)
ep->param2->rel1_to_y = ed->table_parts[ep->param2->description->rel1.id_y % ed->table_parts_size];
if (ep->param2->description->rel2.id_x >= 0)
ep->param2->rel2_to_x = ed->table_parts[ep->param2->description->rel2.id_x % ed->table_parts_size];
if (ep->param2->description->rel2.id_y >= 0)
ep->param2->rel2_to_y = ed->table_parts[ep->param2->description->rel2.id_y % ed->table_parts_size];
}
if (ep->description_pos != 0.0)
ep->chosen_description = epd2;
}
ed->dirty = 1;
#ifdef EDJE_CALC_CACHE
@ -1444,23 +1465,27 @@ _edje_image_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edj
else
{
image_count = 2;
if (ep->param2.description)
image_count += eina_list_count(ep->param2.description->image.tween_list);
if (ep->param2)
image_count += eina_list_count(ep->param2->description->image.tween_list);
image_num = (pos * ((double)image_count - 0.5));
if (image_num > (image_count - 1))
image_num = image_count - 1;
if (image_num == 0)
image_id = ep->param1.description->image.id;
else if (image_num == (image_count - 1))
image_id = ep->param2.description->image.id;
else
{
Edje_Part_Image_Id *imid;
if (ep->param2)
{
if (image_num == (image_count - 1))
image_id = ep->param2->description->image.id;
else
{
Edje_Part_Image_Id *imid;
imid = eina_list_nth(ep->param2.description->image.tween_list,
image_num - 1);
if (imid) image_id = imid->id;
}
imid = eina_list_nth(ep->param2->description->image.tween_list,
image_num - 1);
if (imid) image_id = imid->id;
}
}
if (image_id < 0)
{
printf("EDJE ERROR: part \"%s\" has description, "
@ -1525,6 +1550,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
Edje_Part_Description *chosen_desc;
Edje_Real_Part *confine_to = NULL;
double pos = 0.0;
Edje_Calc_Params lp3;
if ((ep->calculated & FLAG_XY) == FLAG_XY)
{
@ -1559,6 +1585,11 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
#endif
return;
}
#ifdef EDJE_CALC_CACHE
if (ep->state == ed->state)
return ;
#endif
if (flags & FLAG_X)
{
ep->calculating |= flags & FLAG_X;
@ -1577,20 +1608,23 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
state1 = ep->param1.rel2_to_x->state;
#endif
}
if (ep->param2.rel1_to_x)
if (ep->param2)
{
_edje_part_recalc(ed, ep->param2.rel1_to_x, FLAG_X);
if (ep->param2->rel1_to_x)
{
_edje_part_recalc(ed, ep->param2->rel1_to_x, FLAG_X);
#ifdef EDJE_CALC_CACHE
state2 = ep->param2.rel1_to_x->state;
state2 = ep->param2->rel1_to_x->state;
#endif
}
if (ep->param2.rel2_to_x)
{
_edje_part_recalc(ed, ep->param2.rel2_to_x, FLAG_X);
}
if (ep->param2->rel2_to_x)
{
_edje_part_recalc(ed, ep->param2->rel2_to_x, FLAG_X);
#ifdef EDJE_CALC_CACHE
if (state2 < ep->param2.rel2_to_x->state)
state2 = ep->param2.rel2_to_x->state;
if (state2 < ep->param2->rel2_to_x->state)
state2 = ep->param2->rel2_to_x->state;
#endif
}
}
}
if (flags & FLAG_Y)
@ -1612,21 +1646,24 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
state1 = ep->param1.rel2_to_y->state;
#endif
}
if (ep->param2.rel1_to_y)
if (ep->param2)
{
_edje_part_recalc(ed, ep->param2.rel1_to_y, FLAG_Y);
if (ep->param2->rel1_to_y)
{
_edje_part_recalc(ed, ep->param2->rel1_to_y, FLAG_Y);
#ifdef EDJE_CALC_CACHE
if (state2 < ep->param2.rel1_to_y->state)
state2 = ep->param2.rel1_to_y->state;
if (state2 < ep->param2->rel1_to_y->state)
state2 = ep->param2->rel1_to_y->state;
#endif
}
if (ep->param2.rel2_to_y)
{
_edje_part_recalc(ed, ep->param2.rel2_to_y, FLAG_Y);
}
if (ep->param2->rel2_to_y)
{
_edje_part_recalc(ed, ep->param2->rel2_to_y, FLAG_Y);
#ifdef EDJE_CALC_CACHE
if (state2 < ep->param2.rel2_to_y->state)
state2 = ep->param2.rel2_to_y->state;
if (state2 < ep->param2->rel2_to_y->state)
state2 = ep->param2->rel2_to_y->state;
#endif
}
}
}
if (ep->drag && ep->drag->confine_to)
@ -1652,7 +1689,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
#ifndef EDJE_CALC_CACHE
p1 = &lp1;
#else
p1 = ep->param2.description ? &ep->param1.p : &ep->p;
p1 = &ep->param1.p;
#endif
if (ep->param1.description)
@ -1675,33 +1712,32 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
#endif
}
}
if (ep->param2.description)
if (ep->param2 && ep->description_pos != 0.0)
{
int beginning_pos, part_type;
Edje_Calc_Params *p2, *p3;
#ifndef EDJE_CALC_CACHE
Edje_Calc_Params lp3;
p2 = &lp2;
p3 = &lp3;
#ifndef EDJE_CALC_CACHE
p2 = &lp2;
#else
p2 = &ep->param2.p;
p3 = &ep->p;
p2 = &ep->param2->p;
if (ed->all_part_change ||
ep->invalidate ||
state2 >= ep->param2.state ||
statec >= ep->param2.state ||
state2 >= ep->param2->state ||
statec >= ep->param2->state ||
((ep->part->type == EDJE_PART_TYPE_TEXT || ep->part->type == EDJE_PART_TYPE_TEXTBLOCK) && ed->text_part_change))
#endif
{
_edje_part_recalc_single(ed, ep, ep->param2.description, chosen_desc,
ep->param2.rel1_to_x, ep->param2.rel1_to_y, ep->param2.rel2_to_x, ep->param2.rel2_to_y,
_edje_part_recalc_single(ed, ep, ep->param2->description, chosen_desc,
ep->param2->rel1_to_x, ep->param2->rel1_to_y, ep->param2->rel2_to_x, ep->param2->rel2_to_y,
confine_to,
p2,
flags);
#ifdef EDJE_CALC_CACHE
ep->param2.state = ed->state;
ep->param2->state = ed->state;
#endif
}
@ -1789,21 +1825,12 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
}
pf = p3;
#ifdef EDJE_CALC_CACHE
ep->state = ed->state;
#endif
}
else
{
pf = p1;
#ifdef EDJE_CALC_CACHE
ep->state = ep->param1.state;
#endif
}
#ifdef EDJE_CALC_CACHE
ep->invalidate = 0;
#endif
ep->req = pf->req;
if (ep->drag && ep->drag->need_reset)
@ -1912,4 +1939,13 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
ep->calculated |= flags;
ep->calculating = FLAG_NONE;
#ifdef EDJE_CALC_CACHE
if (ep->calculated == FLAG_XY)
{
ep->state = ed->state;
ep->invalidate = 0;
}
#endif
}

View File

@ -205,11 +205,15 @@ _edje_real_part_free(Edje_Real_Part *rp)
if (rp->text.cache.in_str) eina_stringshare_del(rp->text.cache.in_str);
if (rp->text.cache.out_str) eina_stringshare_del(rp->text.cache.out_str);
if (rp->custom.description)
_edje_collection_free_part_description_free(rp->custom.description, 0);
if (rp->custom)
_edje_collection_free_part_description_free(rp->custom->description, 0);
free(rp->drag);
eina_mempool_free(_edje_real_part_state_mp, rp->param2);
eina_mempool_free(_edje_real_part_state_mp, rp->custom);
_edje_unref(rp->edje);
free(rp);
eina_mempool_free(_edje_real_part_mp, rp);
}
static unsigned char
@ -1603,22 +1607,29 @@ edje_edit_part_del(Evas_Object *obj, const char* part)
if (real->param1.rel2_to_x == rp) real->param1.rel2_to_x = NULL;
if (real->param1.rel2_to_y == rp) real->param1.rel2_to_y = NULL;
if (real->param2.rel1_to_x == rp) real->param2.rel1_to_x = NULL;
if (real->param2.rel1_to_y == rp) real->param2.rel1_to_y = NULL;
if (real->param2.rel2_to_x == rp) real->param2.rel2_to_x = NULL;
if (real->param2.rel2_to_y == rp) real->param2.rel2_to_y = NULL;
if (real->param2)
{
if (real->param2->rel1_to_x == rp) real->param2->rel1_to_x = NULL;
if (real->param2->rel1_to_y == rp) real->param2->rel1_to_y = NULL;
if (real->param2->rel2_to_x == rp) real->param2->rel2_to_x = NULL;
if (real->param2->rel2_to_y == rp) real->param2->rel2_to_y = NULL;
}
if (real->custom.rel1_to_x == rp) real->custom.rel1_to_x = NULL;
if (real->custom.rel1_to_y == rp) real->custom.rel1_to_y = NULL;
if (real->custom.rel2_to_x == rp) real->custom.rel2_to_x = NULL;
if (real->custom.rel2_to_y == rp) real->custom.rel2_to_y = NULL;
if (real->custom)
{
if (real->custom->rel1_to_x == rp) real->custom->rel1_to_x = NULL;
if (real->custom->rel1_to_y == rp) real->custom->rel1_to_y = NULL;
if (real->custom->rel2_to_x == rp) real->custom->rel2_to_x = NULL;
if (real->custom->rel2_to_y == rp) real->custom->rel2_to_y = NULL;
}
if (real->clip_to == rp)
{
evas_object_clip_set(real->object, ed->clipper);
real->clip_to = NULL;
}
//TODO confine ??
if (real->drag && real->drag->confine_to == rp)
real->drag->confine_to = NULL;
}
/* Unlink all the parts and descriptions that refer to id */

View File

@ -1548,7 +1548,7 @@ _edje_embryo_fn_custom_state(Embryo_Program *ep, Embryo_Cell *params)
return 0;
/* check whether this part already has a "custom" state */
if (rp->custom.description)
if (rp->custom)
return 0;
GETSTR(name, params[2]);
@ -1564,6 +1564,13 @@ _edje_embryo_fn_custom_state(Embryo_Program *ep, Embryo_Cell *params)
if (!(d = calloc(1, sizeof(Edje_Part_Description))))
return 0;
rp->custom = eina_mempool_malloc(_edje_real_part_state_mp, sizeof (Edje_Real_Part_State));
if (!rp->custom)
{
free(d);
return 0;
}
*d = *parent;
d->state.name = (char *)eina_stringshare_add("custom");
@ -1579,6 +1586,8 @@ _edje_embryo_fn_custom_state(Embryo_Program *ep, Embryo_Cell *params)
Edje_Part_Image_Id *iid_new;
iid_new = calloc(1, sizeof(Edje_Part_Image_Id));
if (!iid_new) continue;
iid_new->id = iid->id;
d->image.tween_list = eina_list_append(d->image.tween_list, iid_new);
@ -1592,7 +1601,7 @@ _edje_embryo_fn_custom_state(Embryo_Program *ep, Embryo_Cell *params)
d->text.style = DUP(d->text.style);
#undef DUP
rp->custom.description = d;
rp->custom->description = d;
return 0;
}
@ -1616,7 +1625,7 @@ _edje_embryo_fn_set_state_val(Embryo_Program *ep, Embryo_Cell *params)
return 0;
/* check whether this part has a "custom" state */
if (!rp->custom.description)
if (!rp->custom)
return 0;
switch (params[2])
@ -1624,90 +1633,90 @@ _edje_embryo_fn_set_state_val(Embryo_Program *ep, Embryo_Cell *params)
case EDJE_STATE_PARAM_ALIGNMENT:
CHKPARAM(4);
GETFLOAT(rp->custom.description->align.x, params[3]);
GETFLOAT(rp->custom.description->align.y, params[4]);
GETFLOAT(rp->custom->description->align.x, params[3]);
GETFLOAT(rp->custom->description->align.y, params[4]);
break;
case EDJE_STATE_PARAM_MIN:
CHKPARAM(4);
GETINT(rp->custom.description->min.w, params[3]);
GETINT(rp->custom.description->min.h, params[4]);
GETINT(rp->custom->description->min.w, params[3]);
GETINT(rp->custom->description->min.h, params[4]);
break;
case EDJE_STATE_PARAM_MAX:
CHKPARAM(4);
GETINT(rp->custom.description->max.w, params[3]);
GETINT(rp->custom.description->max.h, params[4]);
GETINT(rp->custom->description->max.w, params[3]);
GETINT(rp->custom->description->max.h, params[4]);
break;
case EDJE_STATE_PARAM_STEP:
CHKPARAM(4);
GETINT(rp->custom.description->step.x, params[3]);
GETINT(rp->custom.description->step.y, params[4]);
GETINT(rp->custom->description->step.x, params[3]);
GETINT(rp->custom->description->step.y, params[4]);
break;
case EDJE_STATE_PARAM_ASPECT:
CHKPARAM(4);
GETFLOAT(rp->custom.description->aspect.min, params[3]);
GETFLOAT(rp->custom.description->aspect.max, params[4]);
GETFLOAT(rp->custom->description->aspect.min, params[3]);
GETFLOAT(rp->custom->description->aspect.max, params[4]);
break;
case EDJE_STATE_PARAM_ASPECT_PREF:
CHKPARAM(3);
GETINT(rp->custom.description->aspect.prefer, params[3]);
GETINT(rp->custom->description->aspect.prefer, params[3]);
break;
case EDJE_STATE_PARAM_COLOR:
CHKPARAM(6);
GETINT(rp->custom.description->color.r, params[3]);
GETINT(rp->custom.description->color.g, params[4]);
GETINT(rp->custom.description->color.b, params[5]);
GETINT(rp->custom.description->color.a, params[6]);
GETINT(rp->custom->description->color.r, params[3]);
GETINT(rp->custom->description->color.g, params[4]);
GETINT(rp->custom->description->color.b, params[5]);
GETINT(rp->custom->description->color.a, params[6]);
break;
case EDJE_STATE_PARAM_COLOR2:
CHKPARAM(6);
GETINT(rp->custom.description->color2.r, params[3]);
GETINT(rp->custom.description->color2.g, params[4]);
GETINT(rp->custom.description->color2.b, params[5]);
GETINT(rp->custom.description->color2.a, params[6]);
GETINT(rp->custom->description->color2.r, params[3]);
GETINT(rp->custom->description->color2.g, params[4]);
GETINT(rp->custom->description->color2.b, params[5]);
GETINT(rp->custom->description->color2.a, params[6]);
break;
case EDJE_STATE_PARAM_COLOR3:
CHKPARAM(6);
GETINT(rp->custom.description->color3.r, params[3]);
GETINT(rp->custom.description->color3.g, params[4]);
GETINT(rp->custom.description->color3.b, params[5]);
GETINT(rp->custom.description->color3.a, params[6]);
GETINT(rp->custom->description->color3.r, params[3]);
GETINT(rp->custom->description->color3.g, params[4]);
GETINT(rp->custom->description->color3.b, params[5]);
GETINT(rp->custom->description->color3.a, params[6]);
break;
case EDJE_STATE_PARAM_COLOR_CLASS:
CHKPARAM(3);
GETSTR(s, params[3]);
GETSTREVAS(s, rp->custom.description->color_class);
GETSTREVAS(s, rp->custom->description->color_class);
break;
case EDJE_STATE_PARAM_REL1:
CHKPARAM(4);
GETFLOAT(rp->custom.description->rel1.relative_x, params[3]);
GETFLOAT(rp->custom.description->rel1.relative_y, params[4]);
GETFLOAT(rp->custom->description->rel1.relative_x, params[3]);
GETFLOAT(rp->custom->description->rel1.relative_y, params[4]);
break;
case EDJE_STATE_PARAM_REL1_TO:
CHKPARAM(4);
GETINT(rp->custom.description->rel1.id_x, params[3]);
GETINT(rp->custom.description->rel1.id_y, params[4]);
GETINT(rp->custom->description->rel1.id_x, params[3]);
GETINT(rp->custom->description->rel1.id_y, params[4]);
if (rp->param1.description->rel1.id_x >= 0)
rp->param1.rel1_to_x = ed->table_parts[rp->param1.description->rel1.id_x % ed->table_parts_size];
@ -1718,22 +1727,22 @@ _edje_embryo_fn_set_state_val(Embryo_Program *ep, Embryo_Cell *params)
case EDJE_STATE_PARAM_REL1_OFFSET:
CHKPARAM(4);
GETINT(rp->custom.description->rel1.offset_x, params[3]);
GETINT(rp->custom.description->rel1.offset_y, params[4]);
GETINT(rp->custom->description->rel1.offset_x, params[3]);
GETINT(rp->custom->description->rel1.offset_y, params[4]);
break;
case EDJE_STATE_PARAM_REL2:
CHKPARAM(4);
GETFLOAT(rp->custom.description->rel2.relative_x, params[3]);
GETFLOAT(rp->custom.description->rel2.relative_y, params[4]);
GETFLOAT(rp->custom->description->rel2.relative_x, params[3]);
GETFLOAT(rp->custom->description->rel2.relative_y, params[4]);
break;
case EDJE_STATE_PARAM_REL2_TO:
CHKPARAM(4);
GETINT(rp->custom.description->rel2.id_x, params[3]);
GETINT(rp->custom.description->rel2.id_y, params[4]);
GETINT(rp->custom->description->rel2.id_x, params[3]);
GETINT(rp->custom->description->rel2.id_y, params[4]);
if (rp->param1.description->rel2.id_x >= 0)
rp->param1.rel2_to_x = ed->table_parts[rp->param1.description->rel2.id_x % ed->table_parts_size];
@ -1744,52 +1753,52 @@ _edje_embryo_fn_set_state_val(Embryo_Program *ep, Embryo_Cell *params)
case EDJE_STATE_PARAM_REL2_OFFSET:
CHKPARAM(4);
GETINT(rp->custom.description->rel2.offset_x, params[3]);
GETINT(rp->custom.description->rel2.offset_y, params[4]);
GETINT(rp->custom->description->rel2.offset_x, params[3]);
GETINT(rp->custom->description->rel2.offset_y, params[4]);
break;
case EDJE_STATE_PARAM_IMAGE:
if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
CHKPARAM(3);
GETINT(rp->custom.description->image.id, params[3]);
GETINT(rp->custom->description->image.id, params[3]);
break;
case EDJE_STATE_PARAM_BORDER:
if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
CHKPARAM(6);
GETINT(rp->custom.description->border.l, params[3]);
GETINT(rp->custom.description->border.r, params[4]);
GETINT(rp->custom.description->border.t, params[5]);
GETINT(rp->custom.description->border.b, params[6]);
GETINT(rp->custom->description->border.l, params[3]);
GETINT(rp->custom->description->border.r, params[4]);
GETINT(rp->custom->description->border.t, params[5]);
GETINT(rp->custom->description->border.b, params[6]);
break;
case EDJE_STATE_PARAM_FILL_SMOOTH:
if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
CHKPARAM(3);
GETINT(rp->custom.description->fill.smooth, params[3]);
GETINT(rp->custom->description->fill.smooth, params[3]);
break;
case EDJE_STATE_PARAM_FILL_POS:
if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
CHKPARAM(6);
GETFLOAT(rp->custom.description->fill.pos_rel_x, params[3]);
GETFLOAT(rp->custom.description->fill.pos_rel_y, params[4]);
GETINT(rp->custom.description->fill.pos_abs_x, params[5]);
GETINT(rp->custom.description->fill.pos_abs_y, params[6]);
GETFLOAT(rp->custom->description->fill.pos_rel_x, params[3]);
GETFLOAT(rp->custom->description->fill.pos_rel_y, params[4]);
GETINT(rp->custom->description->fill.pos_abs_x, params[5]);
GETINT(rp->custom->description->fill.pos_abs_y, params[6]);
break;
case EDJE_STATE_PARAM_FILL_SIZE:
if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
CHKPARAM(6);
GETFLOAT(rp->custom.description->fill.rel_x, params[3]);
GETFLOAT(rp->custom.description->fill.rel_y, params[4]);
GETINT(rp->custom.description->fill.abs_x, params[5]);
GETINT(rp->custom.description->fill.abs_y, params[6]);
GETFLOAT(rp->custom->description->fill.rel_x, params[3]);
GETFLOAT(rp->custom->description->fill.rel_y, params[4]);
GETINT(rp->custom->description->fill.abs_x, params[5]);
GETINT(rp->custom->description->fill.abs_y, params[6]);
break;
case EDJE_STATE_PARAM_TEXT:
@ -1799,7 +1808,7 @@ _edje_embryo_fn_set_state_val(Embryo_Program *ep, Embryo_Cell *params)
CHKPARAM(3);
GETSTR(s, params[3]);
GETSTREVAS(s, rp->custom.description->text.text);
GETSTREVAS(s, rp->custom->description->text.text);
break;
case EDJE_STATE_PARAM_TEXT_CLASS:
@ -1809,7 +1818,7 @@ _edje_embryo_fn_set_state_val(Embryo_Program *ep, Embryo_Cell *params)
CHKPARAM(3);
GETSTR(s, params[3]);
GETSTREVAS(s, rp->custom.description->text.text_class);
GETSTREVAS(s, rp->custom->description->text.text_class);
break;
case EDJE_STATE_PARAM_TEXT_FONT:
@ -1817,7 +1826,7 @@ _edje_embryo_fn_set_state_val(Embryo_Program *ep, Embryo_Cell *params)
CHKPARAM(3);
GETSTR(s, params[3]);
GETSTREVAS(s, rp->custom.description->text.font);
GETSTREVAS(s, rp->custom->description->text.font);
break;
case EDJE_STATE_PARAM_TEXT_STYLE:
@ -1825,22 +1834,22 @@ _edje_embryo_fn_set_state_val(Embryo_Program *ep, Embryo_Cell *params)
CHKPARAM(3);
GETSTR(s, params[3]);
GETSTREVAS(s, rp->custom.description->text.style);
GETSTREVAS(s, rp->custom->description->text.style);
break;
case EDJE_STATE_PARAM_TEXT_SIZE:
if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
CHKPARAM(3);
GETINT(rp->custom.description->text.size, params[3]);
GETINT(rp->custom->description->text.size, params[3]);
break;
case EDJE_STATE_PARAM_TEXT_FIT:
if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
CHKPARAM(4);
GETINT(rp->custom.description->text.fit_x, params[3]);
GETINT(rp->custom.description->text.fit_y, params[4]);
GETINT(rp->custom->description->text.fit_x, params[3]);
GETINT(rp->custom->description->text.fit_y, params[4]);
break;
case EDJE_STATE_PARAM_TEXT_MIN:
@ -1849,8 +1858,8 @@ _edje_embryo_fn_set_state_val(Embryo_Program *ep, Embryo_Cell *params)
return 0;
CHKPARAM(4);
GETINT(rp->custom.description->text.min_x, params[3]);
GETINT(rp->custom.description->text.min_y, params[4]);
GETINT(rp->custom->description->text.min_x, params[3]);
GETINT(rp->custom->description->text.min_y, params[4]);
break;
case EDJE_STATE_PARAM_TEXT_MAX:
@ -1859,22 +1868,22 @@ _edje_embryo_fn_set_state_val(Embryo_Program *ep, Embryo_Cell *params)
return 0;
CHKPARAM(4);
GETINT(rp->custom.description->text.max_x, params[3]);
GETINT(rp->custom.description->text.max_y, params[4]);
GETINT(rp->custom->description->text.max_x, params[3]);
GETINT(rp->custom->description->text.max_y, params[4]);
break;
case EDJE_STATE_PARAM_TEXT_ALIGN:
if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
CHKPARAM(4);
GETFLOAT(rp->custom.description->text.align.x, params[3]);
GETFLOAT(rp->custom.description->text.align.y, params[4]);
GETFLOAT(rp->custom->description->text.align.x, params[3]);
GETFLOAT(rp->custom->description->text.align.y, params[4]);
break;
case EDJE_STATE_PARAM_VISIBLE:
CHKPARAM(3);
GETINT(rp->custom.description->visible, params[3]);
GETINT(rp->custom->description->visible, params[3]);
break;
default:
@ -1907,7 +1916,7 @@ _edje_embryo_fn_get_state_val(Embryo_Program *ep, Embryo_Cell *params)
return 0;
/* check whether this part has a "custom" state */
if (!rp->custom.description)
if (!rp->custom)
return 0;
switch (params[2])
@ -1915,162 +1924,162 @@ _edje_embryo_fn_get_state_val(Embryo_Program *ep, Embryo_Cell *params)
case EDJE_STATE_PARAM_ALIGNMENT:
CHKPARAM(4);
SETFLOAT(rp->custom.description->align.x, params[3]);
SETFLOAT(rp->custom.description->align.y, params[4]);
SETFLOAT(rp->custom->description->align.x, params[3]);
SETFLOAT(rp->custom->description->align.y, params[4]);
break;
case EDJE_STATE_PARAM_MIN:
CHKPARAM(4);
SETINT(rp->custom.description->min.w, params[3]);
SETINT(rp->custom.description->min.h, params[4]);
SETINT(rp->custom->description->min.w, params[3]);
SETINT(rp->custom->description->min.h, params[4]);
break;
case EDJE_STATE_PARAM_MAX:
CHKPARAM(4);
SETINT(rp->custom.description->max.w, params[3]);
SETINT(rp->custom.description->max.h, params[4]);
SETINT(rp->custom->description->max.w, params[3]);
SETINT(rp->custom->description->max.h, params[4]);
break;
case EDJE_STATE_PARAM_STEP:
CHKPARAM(4);
SETINT(rp->custom.description->step.x, params[3]);
SETINT(rp->custom.description->step.y, params[4]);
SETINT(rp->custom->description->step.x, params[3]);
SETINT(rp->custom->description->step.y, params[4]);
break;
case EDJE_STATE_PARAM_ASPECT:
CHKPARAM(4);
SETFLOAT(rp->custom.description->aspect.min, params[3]);
SETFLOAT(rp->custom.description->aspect.max, params[4]);
SETFLOAT(rp->custom->description->aspect.min, params[3]);
SETFLOAT(rp->custom->description->aspect.max, params[4]);
break;
case EDJE_STATE_PARAM_ASPECT_PREF:
CHKPARAM(3);
SETINT(rp->custom.description->aspect.prefer, params[3]);
SETINT(rp->custom->description->aspect.prefer, params[3]);
break;
case EDJE_STATE_PARAM_COLOR:
CHKPARAM(6);
SETINT(rp->custom.description->color.r, params[3]);
SETINT(rp->custom.description->color.g, params[4]);
SETINT(rp->custom.description->color.b, params[5]);
SETINT(rp->custom.description->color.a, params[6]);
SETINT(rp->custom->description->color.r, params[3]);
SETINT(rp->custom->description->color.g, params[4]);
SETINT(rp->custom->description->color.b, params[5]);
SETINT(rp->custom->description->color.a, params[6]);
break;
case EDJE_STATE_PARAM_COLOR2:
CHKPARAM(6);
SETINT(rp->custom.description->color2.r, params[3]);
SETINT(rp->custom.description->color2.g, params[4]);
SETINT(rp->custom.description->color2.b, params[5]);
SETINT(rp->custom.description->color2.a, params[6]);
SETINT(rp->custom->description->color2.r, params[3]);
SETINT(rp->custom->description->color2.g, params[4]);
SETINT(rp->custom->description->color2.b, params[5]);
SETINT(rp->custom->description->color2.a, params[6]);
break;
case EDJE_STATE_PARAM_COLOR3:
CHKPARAM(6);
SETINT(rp->custom.description->color3.r, params[3]);
SETINT(rp->custom.description->color3.g, params[4]);
SETINT(rp->custom.description->color3.b, params[5]);
SETINT(rp->custom.description->color3.a, params[6]);
SETINT(rp->custom->description->color3.r, params[3]);
SETINT(rp->custom->description->color3.g, params[4]);
SETINT(rp->custom->description->color3.b, params[5]);
SETINT(rp->custom->description->color3.a, params[6]);
break;
case EDJE_STATE_PARAM_COLOR_CLASS:
CHKPARAM(4);
s = rp->custom.description->color_class;
s = rp->custom->description->color_class;
SETSTRALLOCATE(s);
break;
case EDJE_STATE_PARAM_REL1:
CHKPARAM(4);
SETFLOAT(rp->custom.description->rel1.relative_x, params[3]);
SETFLOAT(rp->custom.description->rel1.relative_y, params[4]);
SETFLOAT(rp->custom->description->rel1.relative_x, params[3]);
SETFLOAT(rp->custom->description->rel1.relative_y, params[4]);
break;
case EDJE_STATE_PARAM_REL1_TO:
CHKPARAM(4);
SETINT(rp->custom.description->rel1.id_x, params[3]);
SETINT(rp->custom.description->rel1.id_y, params[4]);
SETINT(rp->custom->description->rel1.id_x, params[3]);
SETINT(rp->custom->description->rel1.id_y, params[4]);
break;
case EDJE_STATE_PARAM_REL1_OFFSET:
CHKPARAM(4);
SETINT(rp->custom.description->rel1.offset_x, params[3]);
SETINT(rp->custom.description->rel1.offset_y, params[4]);
SETINT(rp->custom->description->rel1.offset_x, params[3]);
SETINT(rp->custom->description->rel1.offset_y, params[4]);
break;
case EDJE_STATE_PARAM_REL2:
CHKPARAM(4);
SETFLOAT(rp->custom.description->rel2.relative_x, params[3]);
SETFLOAT(rp->custom.description->rel2.relative_y, params[4]);
SETFLOAT(rp->custom->description->rel2.relative_x, params[3]);
SETFLOAT(rp->custom->description->rel2.relative_y, params[4]);
break;
case EDJE_STATE_PARAM_REL2_TO:
CHKPARAM(4);
SETINT(rp->custom.description->rel2.id_x, params[3]);
SETINT(rp->custom.description->rel2.id_y, params[4]);
SETINT(rp->custom->description->rel2.id_x, params[3]);
SETINT(rp->custom->description->rel2.id_y, params[4]);
break;
case EDJE_STATE_PARAM_REL2_OFFSET:
CHKPARAM(4);
SETINT(rp->custom.description->rel2.offset_x, params[3]);
SETINT(rp->custom.description->rel2.offset_y, params[4]);
SETINT(rp->custom->description->rel2.offset_x, params[3]);
SETINT(rp->custom->description->rel2.offset_y, params[4]);
break;
case EDJE_STATE_PARAM_IMAGE:
if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
CHKPARAM(3);
SETINT(rp->custom.description->image.id, params[3]);
SETINT(rp->custom->description->image.id, params[3]);
break;
case EDJE_STATE_PARAM_BORDER:
if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
CHKPARAM(6);
SETINT(rp->custom.description->border.l, params[3]);
SETINT(rp->custom.description->border.r, params[4]);
SETINT(rp->custom.description->border.t, params[5]);
SETINT(rp->custom.description->border.b, params[6]);
SETINT(rp->custom->description->border.l, params[3]);
SETINT(rp->custom->description->border.r, params[4]);
SETINT(rp->custom->description->border.t, params[5]);
SETINT(rp->custom->description->border.b, params[6]);
break;
case EDJE_STATE_PARAM_FILL_SMOOTH:
if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
CHKPARAM(3);
SETINT(rp->custom.description->fill.smooth, params[3]);
SETINT(rp->custom->description->fill.smooth, params[3]);
break;
case EDJE_STATE_PARAM_FILL_POS:
if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
CHKPARAM(6);
SETFLOAT(rp->custom.description->fill.pos_rel_x, params[3]);
SETFLOAT(rp->custom.description->fill.pos_rel_y, params[4]);
SETINT(rp->custom.description->fill.pos_abs_x, params[5]);
SETINT(rp->custom.description->fill.pos_abs_y, params[6]);
SETFLOAT(rp->custom->description->fill.pos_rel_x, params[3]);
SETFLOAT(rp->custom->description->fill.pos_rel_y, params[4]);
SETINT(rp->custom->description->fill.pos_abs_x, params[5]);
SETINT(rp->custom->description->fill.pos_abs_y, params[6]);
break;
case EDJE_STATE_PARAM_FILL_SIZE:
if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
CHKPARAM(6);
SETFLOAT(rp->custom.description->fill.rel_x, params[3]);
SETFLOAT(rp->custom.description->fill.rel_y, params[4]);
SETINT(rp->custom.description->fill.abs_x, params[5]);
SETINT(rp->custom.description->fill.abs_y, params[6]);
SETFLOAT(rp->custom->description->fill.rel_x, params[3]);
SETFLOAT(rp->custom->description->fill.rel_y, params[4]);
SETINT(rp->custom->description->fill.abs_x, params[5]);
SETINT(rp->custom->description->fill.abs_y, params[6]);
break;
case EDJE_STATE_PARAM_TEXT:
@ -2079,7 +2088,7 @@ _edje_embryo_fn_get_state_val(Embryo_Program *ep, Embryo_Cell *params)
return 0;
CHKPARAM(4);
s = rp->custom.description->text.text;
s = rp->custom->description->text.text;
SETSTRALLOCATE(s);
break;
@ -2089,7 +2098,7 @@ _edje_embryo_fn_get_state_val(Embryo_Program *ep, Embryo_Cell *params)
return 0;
CHKPARAM(4);
s = rp->custom.description->text.text_class;
s = rp->custom->description->text.text_class;
SETSTRALLOCATE(s);
break;
@ -2097,7 +2106,7 @@ _edje_embryo_fn_get_state_val(Embryo_Program *ep, Embryo_Cell *params)
if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
CHKPARAM(4);
s = rp->custom.description->text.font;
s = rp->custom->description->text.font;
SETSTRALLOCATE(s);
break;
@ -2105,7 +2114,7 @@ _edje_embryo_fn_get_state_val(Embryo_Program *ep, Embryo_Cell *params)
if ((rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return 0;
CHKPARAM(4);
s = rp->custom.description->text.style;
s = rp->custom->description->text.style;
SETSTRALLOCATE(s);
break;
@ -2113,15 +2122,15 @@ _edje_embryo_fn_get_state_val(Embryo_Program *ep, Embryo_Cell *params)
if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
CHKPARAM(3);
SETINT(rp->custom.description->text.size, params[3]);
SETINT(rp->custom->description->text.size, params[3]);
break;
case EDJE_STATE_PARAM_TEXT_FIT:
if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
CHKPARAM(4);
SETINT(rp->custom.description->text.fit_x, params[3]);
SETINT(rp->custom.description->text.fit_y, params[4]);
SETINT(rp->custom->description->text.fit_x, params[3]);
SETINT(rp->custom->description->text.fit_y, params[4]);
break;
case EDJE_STATE_PARAM_TEXT_MIN:
@ -2130,8 +2139,8 @@ _edje_embryo_fn_get_state_val(Embryo_Program *ep, Embryo_Cell *params)
return 0;
CHKPARAM(4);
SETINT(rp->custom.description->text.min_x, params[3]);
SETINT(rp->custom.description->text.min_y, params[4]);
SETINT(rp->custom->description->text.min_x, params[3]);
SETINT(rp->custom->description->text.min_y, params[4]);
break;
case EDJE_STATE_PARAM_TEXT_MAX:
@ -2140,22 +2149,22 @@ _edje_embryo_fn_get_state_val(Embryo_Program *ep, Embryo_Cell *params)
return 0;
CHKPARAM(4);
SETINT(rp->custom.description->text.max_x, params[3]);
SETINT(rp->custom.description->text.max_y, params[4]);
SETINT(rp->custom->description->text.max_x, params[3]);
SETINT(rp->custom->description->text.max_y, params[4]);
break;
case EDJE_STATE_PARAM_TEXT_ALIGN:
if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
CHKPARAM(4);
SETFLOAT(rp->custom.description->text.align.x, params[3]);
SETFLOAT(rp->custom.description->text.align.y, params[4]);
SETFLOAT(rp->custom->description->text.align.x, params[3]);
SETFLOAT(rp->custom->description->text.align.y, params[4]);
break;
case EDJE_STATE_PARAM_VISIBLE:
CHKPARAM(3);
SETINT(rp->custom.description->visible, params[3]);
SETINT(rp->custom->description->visible, params[3]);
break;
default:

View File

@ -346,13 +346,15 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
Edje_Real_Part *rp;
ep = eina_list_data_get(l);
rp = calloc(1, sizeof(Edje_Real_Part));
rp = eina_mempool_malloc(_edje_real_part_mp, sizeof(Edje_Real_Part));
if (!rp)
{
ed->load_error = EDJE_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
return 0;
}
memset(rp, 0, sizeof (Edje_Real_Part));
if ((ep->dragable.x != 0) || (ep->dragable.y != 0))
{
rp->drag = calloc(1, sizeof (Edje_Real_Part_Drag));
@ -846,13 +848,17 @@ _edje_file_del(Edje *ed)
if (rp->text.cache.in_str) eina_stringshare_del(rp->text.cache.in_str);
if (rp->text.cache.out_str) eina_stringshare_del(rp->text.cache.out_str);
if (rp->custom.description)
_edje_collection_free_part_description_free(rp->custom.description, ed->file->free_strings);
if (rp->custom)
_edje_collection_free_part_description_free(rp->custom->description, ed->file->free_strings);
/* Cleanup optional part. */
free(rp->drag);
eina_mempool_free(_edje_real_part_state_mp, rp->param2);
eina_mempool_free(_edje_real_part_state_mp, rp->custom);
_edje_unref(rp->edje);
free(rp);
eina_mempool_free(_edje_real_part_mp, rp);
}
}
if ((ed->file) && (ed->collection))

View File

@ -7,6 +7,8 @@
#include "edje_private.h"
static int initted = 0;
Eina_Mempool *_edje_real_part_mp = NULL;
Eina_Mempool *_edje_real_part_state_mp = NULL;
/************************** API Routines **************************/
@ -20,6 +22,8 @@ edje_init(void)
initted++;
if (initted == 1)
{
const char *choice;
eina_init();
ecore_job_init();
srand(time(NULL));
@ -28,9 +32,34 @@ edje_init(void)
_edje_box_init();
embryo_init();
eet_init();
_edje_real_part_mp = eina_mempool_add("chained_mempool",
"Edje_Real_Part", NULL,
sizeof (Edje_Real_Part), 128);
if (!_edje_real_part_mp)
{
EINA_ERROR_PERR("ERROR: Mempool for Edje_Real_Part cannot be allocated.\n");
goto on_error;
}
_edje_real_part_state_mp = eina_mempool_add("chained_mempool",
"Edje_Real_Part_State", NULL,
sizeof (Edje_Real_Part_State), 256);
if (!_edje_real_part_state_mp)
{
EINA_ERROR_PERR("ERROR: Mempool for Edje_Real_Part_State cannot be allocated.\n");
goto on_error;
}
}
_edje_message_init();
return initted;
on_error:
eina_mempool_del(_edje_real_part_state_mp);
eina_mempool_del(_edje_real_part_mp);
_edje_real_part_state_mp = NULL;
_edje_real_part_mp = NULL;
return 0;
}
/** Shutdown the EDJE library.
@ -55,6 +84,12 @@ edje_shutdown(void)
_edje_text_class_members_free();
_edje_text_class_hash_free();
_edje_box_shutdown();
eina_mempool_del(_edje_real_part_state_mp);
eina_mempool_del(_edje_real_part_mp);
_edje_real_part_state_mp = NULL;
_edje_real_part_mp = NULL;
embryo_shutdown();
ecore_job_shutdown();
eet_shutdown();

View File

@ -840,11 +840,11 @@ struct _Edje_Real_Part
double description_pos; // 8
Edje_Part_Description *chosen_description; // 4
Edje_Real_Part_State param1, param2, custom; // 60 // FIXME: custom should be alloced on demand - 20--
// WITH EDJE_CALC_CACHE: 420
Edje_Real_Part_State param1; // 20
// WITH EDJE_CALC_CACHE: 140
Edje_Real_Part_State *param2, *custom; // 8
#ifdef EDJE_CALC_CACHE
Edje_Calc_Params p; // 116
int state; // 4
#endif
@ -862,8 +862,8 @@ struct _Edje_Real_Part
#ifdef EDJE_CALC_CACHE
unsigned char invalidate : 1;
#endif
}; // 298
// WITH EDJE_CALC_CACHE: 778
}; // 260
// WITH EDJE_CALC_CACHE: 400
struct _Edje_Running_Program
{
@ -1101,6 +1101,9 @@ extern double _edje_scale;
extern int _edje_freeze_val;
extern int _edje_freeze_calc_count;
extern Eina_Mempool *_edje_real_part_mp;
extern Eina_Mempool *_edje_real_part_state_mp;
void _edje_part_pos_set(Edje *ed, Edje_Real_Part *ep, int mode, double pos);
Edje_Part_Description *_edje_part_description_find(Edje *ed, Edje_Real_Part *rp, const char *name, double val);
void _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char *d1, double v1, const char *d2, double v2);