Edje postponed calculations.

This makes use of new Evas_Smart_Class calculate() callback to
postpone calculations until render time, possible saving lots of
calculations to happen.

It is another try, with Cedric's changes to force recalculations when
requried (ie: just before doing some edje_object_*_get()), let's see
if this one solve found issues.



SVN revision: 37620
This commit is contained in:
Gustavo Sverzut Barbieri 2008-11-14 11:06:15 +00:00
parent 5768d41053
commit f53febde32
7 changed files with 93 additions and 22 deletions

View File

@ -3,7 +3,7 @@ dnl Process this file with autoconf to produce a configure script.
# get rid of that stupid cache mechanism
rm -f config.cache
AC_INIT([edje], [0.9.9.050], [enlightenment-devel@lists.sourceforge.net])
AC_INIT([edje], [0.9.9.050.7], [enlightenment-devel@lists.sourceforge.net])
AC_PREREQ(2.52)
AC_CONFIG_SRCDIR([configure.ac])
AC_CONFIG_MACRO_DIR([m4])

View File

@ -137,21 +137,30 @@ _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char *d1, doubl
void
_edje_recalc(Edje *ed)
{
int i;
if (!ed->dirty)
{
return;
}
if ((ed->freeze > 0) || (_edje_freeze_val > 0))
{
ed->recalc = 1;
if (!ed->calc_only)
{
if (_edje_freeze_val > 0) _edje_freeze_calc_count++;
return;
return ;
}
}
if (ed->postponed) return ;
evas_object_smart_changed(ed->obj);
ed->postponed = 1;
}
void
_edje_recalc_do(Edje *ed)
{
int i;
ed->postponed = 0;
if (!ed->dirty)
{
return;
}
for (i = 0; i < ed->table_parts_size; i++)
{
Edje_Real_Part *ep;
@ -168,8 +177,9 @@ _edje_recalc(Edje *ed)
if (ep->calculated != FLAG_XY)
_edje_part_recalc(ed, ep, (~ep->calculated) & FLAG_XY);
}
ed->dirty = 0;
if (!ed->calc_only) ed->recalc = 0;
ed->dirty = 0;
ed->calc_only = 0;
}
int

View File

@ -117,7 +117,7 @@ _edje_mouse_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
}
ed->dirty = 1;
}
_edje_recalc(ed);
_edje_recalc_do(ed);
/*
_edje_thaw(ed);
_edje_unref(ed);
@ -139,7 +139,7 @@ _edje_mouse_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
_edje_emit(ed, "drag", rp->part->name);
ed->dirty = 1;
rp->drag.need_reset = 1;
_edje_recalc(ed);
_edje_recalc_do(ed);
}
}
}
@ -162,7 +162,7 @@ _edje_mouse_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
rp->clicked_button = ev->button;
rp->still_in = 1;
}
// _edje_recalc(ed);
// _edje_recalc_do(ed);
_edje_thaw(ed);
_edje_unref(ed);
return;
@ -226,7 +226,7 @@ _edje_mouse_up_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
rp->clicked_button = 0;
rp->still_in = 0;
// _edje_recalc(ed);
// _edje_recalc_do(ed);
_edje_thaw(ed);
_edje_unref(ed);
return;
@ -282,7 +282,7 @@ _edje_mouse_move_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
rp->drag.tmp.y = ev->cur.canvas.y - rp->drag.down.y;
ed->dirty = 1;
}
_edje_recalc(ed);
_edje_recalc_do(ed);
}
if ((rp->part->dragable.x) || (rp->part->dragable.y))
{
@ -299,7 +299,7 @@ _edje_mouse_move_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
if (!ignored)
_edje_emit(ed, "drag", rp->part->name);
ed->dirty = 1;
_edje_recalc(ed);
_edje_recalc_do(ed);
}
}
}

View File

@ -667,6 +667,7 @@ struct _Edje
unsigned short walking_actions : 1;
unsigned short block_break : 1;
unsigned short delete_me : 1;
unsigned short postponed : 1;
};
struct _Edje_Real_Part
@ -1009,6 +1010,7 @@ 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);
void _edje_recalc(Edje *ed);
void _edje_recalc_do(Edje *ed);
int _edje_part_dragable_calc(Edje *ed, Edje_Real_Part *ep, double *x, double *y);
void _edje_dragable_pos_set(Edje *ed, Edje_Real_Part *ep, double x, double y);

View File

@ -749,7 +749,7 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force, const char *ssig, const
_edje_embryo_test_run(ed, fname, ssig, ssrc);
// _edje_emit(ed, "program,stop", pr->name);
if (_edje_block_break(ed)) goto break_prog;
_edje_recalc(ed);
_edje_recalc_do(ed);
}
else if (pr->action == EDJE_ACTION_TYPE_FOCUS_SET)
{

View File

@ -13,6 +13,7 @@ static void _edje_smart_hide(Evas_Object * obj);
static void _edje_smart_color_set(Evas_Object * obj, int r, int g, int b, int a);
static void _edje_smart_clip_set(Evas_Object * obj, Evas_Object * clip);
static void _edje_smart_clip_unset(Evas_Object * obj);
static void _edje_smart_calculate(Evas_Object * obj);
static Evas_Smart *_edje_smart = NULL;
@ -45,7 +46,7 @@ edje_object_add(Evas *evas)
_edje_smart_color_set,
_edje_smart_clip_set,
_edje_smart_clip_unset,
NULL,
_edje_smart_calculate,
NULL,
NULL,
NULL
@ -170,7 +171,7 @@ _edje_smart_resize(Evas_Object * obj, Evas_Coord w, Evas_Coord h)
}
// evas_object_resize(ed->clipper, ed->w, ed->h);
ed->dirty = 1;
_edje_recalc(ed);
_edje_recalc_do(ed);
_edje_emit(ed, "resize", NULL);
}
@ -244,3 +245,13 @@ _edje_smart_clip_unset(Evas_Object * obj)
evas_object_clip_unset(ed->clipper);
// _edje_emit(ed, "clip_unset", NULL);
}
static void
_edje_smart_calculate(Evas_Object *obj)
{
Edje *ed;
ed = evas_object_smart_data_get(obj);
if (!ed) return;
_edje_recalc_do(ed);
}

View File

@ -75,7 +75,7 @@ _edje_thaw_edje(Edje *ed)
if (ed2) _edje_thaw_edje(ed2);
}
}
if ((ed->recalc) && (ed->freeze <= 0)) _edje_recalc(ed);
if ((ed->recalc) && (ed->freeze <= 0)) _edje_recalc_do(ed);
}
#endif
@ -785,6 +785,10 @@ edje_object_part_object_get(const Evas_Object *obj, const char *part)
ed = _edje_fetch(obj);
if ((!ed) || (!part)) return NULL;
/* Need to recalc before providing the object. */
_edje_recalc_do(ed);
rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp) return NULL;
return rp->object;
@ -818,6 +822,10 @@ edje_object_part_geometry_get(const Evas_Object *obj, const char *part, Evas_Coo
if (h) *h = 0;
return;
}
/* Need to recalc before providing the object. */
_edje_recalc_do(ed);
rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp)
{
@ -904,6 +912,10 @@ edje_object_part_text_get(const Evas_Object *obj, const char *part)
ed = _edje_fetch(obj);
if ((!ed) || (!part)) return NULL;
/* Need to recalc before providing the object. */
_edje_recalc_do(ed);
rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp) return NULL;
if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
@ -1051,6 +1063,10 @@ edje_object_part_swallow(Evas_Object *obj, const char *part, Evas_Object *obj_sw
ed = _edje_fetch(obj);
if ((!ed) || (!part)) return;
/* Need to recalc before providing the object. */
_edje_recalc_do(ed);
rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp) return;
if (rp->part->type != EDJE_PART_TYPE_SWALLOW) return;
@ -1189,7 +1205,7 @@ edje_object_part_unswallow(Evas_Object *obj, Evas_Object *obj_swallow)
rp->swallow_params.max.w = 0;
rp->swallow_params.max.h = 0;
rp->edje->dirty = 1;
_edje_recalc(rp->edje);
_edje_recalc_do(rp->edje);
return;
}
}
@ -1207,6 +1223,10 @@ edje_object_part_swallow_get(const Evas_Object *obj, const char *part)
ed = _edje_fetch(obj);
if ((!ed) || (!part)) return NULL;
/* Need to recalc before providing the object. */
_edje_recalc_do(ed);
rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp) return NULL;
return rp->swallowed_object;
@ -1256,6 +1276,10 @@ edje_object_size_max_get(const Evas_Object *obj, Evas_Coord *maxw, Evas_Coord *m
if (maxh) *maxh = 0;
return;
}
/* Need to recalc before providing the object. */
_edje_recalc_do(ed);
if (ed->collection->prop.max.w == 0)
{
/* XXX TODO: convert maxw to 0, fix things that break. */
@ -1298,7 +1322,7 @@ edje_object_calc_force(Evas_Object *obj)
_edje_freeze_val = 0;
ed->freeze = 0;
_edje_recalc(ed);
_edje_recalc_do(ed);
ed->freeze = pf;
_edje_freeze_val = pf2;
@ -1362,7 +1386,7 @@ edje_object_size_min_restricted_calc(Evas_Object *obj, Evas_Coord *minw, Evas_Co
ok = 0;
ed->dirty = 1;
_edje_recalc(ed);
_edje_recalc_do(ed);
if (reset_maxwh)
{
maxw = 0;
@ -1466,6 +1490,10 @@ edje_object_part_state_get(const Evas_Object *obj, const char *part, double *val
if (val_ret) *val_ret = 0;
return "";
}
/* Need to recalc before providing the object. */
_edje_recalc_do(ed);
rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp)
{
@ -1510,6 +1538,10 @@ edje_object_part_drag_dir_get(const Evas_Object *obj, const char *part)
ed = _edje_fetch(obj);
if ((!ed) || (!part)) return EDJE_DRAG_DIR_NONE;
/* Need to recalc before providing the object. */
_edje_recalc_do(ed);
rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp) return EDJE_DRAG_DIR_NONE;
if ((rp->part->dragable.x) && (rp->part->dragable.y)) return EDJE_DRAG_DIR_XY;
@ -1574,6 +1606,10 @@ edje_object_part_drag_value_get(const Evas_Object *obj, const char *part, double
if (dy) *dy = 0;
return;
}
/* Need to recalc before providing the object. */
_edje_recalc_do(ed);
rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp)
{
@ -1639,6 +1675,10 @@ edje_object_part_drag_size_get(const Evas_Object *obj, const char *part, double
if (dh) *dh = 0;
return;
}
/* Need to recalc before providing the object. */
_edje_recalc_do(ed);
rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp)
{
@ -1697,6 +1737,10 @@ edje_object_part_drag_step_get(const Evas_Object *obj, const char *part, double
if (dy) *dy = 0;
return;
}
/* Need to recalc before providing the object. */
_edje_recalc_do(ed);
rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp)
{
@ -1755,6 +1799,10 @@ edje_object_part_drag_page_get(const Evas_Object *obj, const char *part, double
if (dy) *dy = 0;
return;
}
/* Need to recalc before providing the object. */
_edje_recalc_do(ed);
rp = _edje_real_part_recursive_get(ed, (char *)part);
if (!rp)
{