From 7df190d264e1d0e5d0cc4955ca87611881951161 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Fri, 14 Aug 2009 17:19:42 +0000 Subject: [PATCH] * 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 --- legacy/edje/src/lib/edje_calc.c | 180 +++++++++++-------- legacy/edje/src/lib/edje_edit.c | 35 ++-- legacy/edje/src/lib/edje_embryo.c | 273 +++++++++++++++-------------- legacy/edje/src/lib/edje_load.c | 14 +- legacy/edje/src/lib/edje_main.c | 35 ++++ legacy/edje/src/lib/edje_private.h | 13 +- 6 files changed, 325 insertions(+), 225 deletions(-) diff --git a/legacy/edje/src/lib/edje_calc.c b/legacy/edje/src/lib/edje_calc.c index 611afc246b..3721011456 100644 --- a/legacy/edje/src/lib/edje_calc.c +++ b/legacy/edje/src/lib/edje_calc.c @@ -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 + } diff --git a/legacy/edje/src/lib/edje_edit.c b/legacy/edje/src/lib/edje_edit.c index b0b282df15..8a0442955f 100644 --- a/legacy/edje/src/lib/edje_edit.c +++ b/legacy/edje/src/lib/edje_edit.c @@ -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 */ diff --git a/legacy/edje/src/lib/edje_embryo.c b/legacy/edje/src/lib/edje_embryo.c index 84753e8a80..b12db3dcce 100644 --- a/legacy/edje/src/lib/edje_embryo.c +++ b/legacy/edje/src/lib/edje_embryo.c @@ -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: diff --git a/legacy/edje/src/lib/edje_load.c b/legacy/edje/src/lib/edje_load.c index 2b25b51cdf..08c469d85a 100644 --- a/legacy/edje/src/lib/edje_load.c +++ b/legacy/edje/src/lib/edje_load.c @@ -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)) diff --git a/legacy/edje/src/lib/edje_main.c b/legacy/edje/src/lib/edje_main.c index 976b532001..abaa7603cc 100644 --- a/legacy/edje/src/lib/edje_main.c +++ b/legacy/edje/src/lib/edje_main.c @@ -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(); diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index 158d9666ec..87e750d33f 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -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);