faster lookups for programs & parts - saves a lot of list walking

SVN revision: 9552
This commit is contained in:
Carsten Haitzler 2004-04-01 15:32:17 +00:00
parent d9d7b969dd
commit 40f9fc4f31
6 changed files with 186 additions and 120 deletions

View File

@ -425,6 +425,11 @@ struct _Edje
int load_error; int load_error;
int freeze; int freeze;
Edje_Var_Pool *var_pool; Edje_Var_Pool *var_pool;
/* for faster lookups to avoid nth list walks */
int table_parts_size;
Edje_Real_Part **table_parts;
int table_programs_size;
Edje_Program **table_programs;
}; };
struct _Edje_Real_Part struct _Edje_Real_Part

View File

@ -30,6 +30,7 @@ edje_data.c \
edje_embryo.c \ edje_embryo.c \
edje_load.c \ edje_load.c \
edje_main.c \ edje_main.c \
edje_misc.c \
edje_program.c \ edje_program.c \
edje_smart.c \ edje_smart.c \
edje_text.c \ edje_text.c \

View File

@ -91,13 +91,13 @@ _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, char *d1, double v1,
if (ep->param1.description) if (ep->param1.description)
{ {
if (ep->param1.description->rel1.id_x >= 0) if (ep->param1.description->rel1.id_x >= 0)
ep->param1.rel1_to_x = evas_list_nth(ed->parts, ep->param1.description->rel1.id_x); ep->param1.rel1_to_x = ed->table_parts[ep->param1.description->rel1.id_x % ed->table_parts_size];
if (ep->param1.description->rel1.id_y >= 0) if (ep->param1.description->rel1.id_y >= 0)
ep->param1.rel1_to_y = evas_list_nth(ed->parts, ep->param1.description->rel1.id_y); ep->param1.rel1_to_y = ed->table_parts[ep->param1.description->rel1.id_y % ed->table_parts_size];
if (ep->param1.description->rel2.id_x >= 0) if (ep->param1.description->rel2.id_x >= 0)
ep->param1.rel2_to_x = evas_list_nth(ed->parts, ep->param1.description->rel2.id_x); ep->param1.rel2_to_x = ed->table_parts[ep->param1.description->rel2.id_x % ed->table_parts_size];
if (ep->param1.description->rel2.id_y >= 0) if (ep->param1.description->rel2.id_y >= 0)
ep->param1.rel2_to_y = evas_list_nth(ed->parts, ep->param1.description->rel2.id_y); ep->param1.rel2_to_y = ed->table_parts[ep->param1.description->rel2.id_y % ed->table_parts_size];
} }
if (!strcmp(d2, "default") && (v2 == 0.0)) if (!strcmp(d2, "default") && (v2 == 0.0))
@ -150,13 +150,13 @@ _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, char *d1, double v1,
if (ep->param1.description) if (ep->param1.description)
{ {
if (ep->param1.description->rel1.id_x >= 0) if (ep->param1.description->rel1.id_x >= 0)
ep->param1.rel1_to_x = evas_list_nth(ed->parts, ep->param1.description->rel1.id_x); ep->param1.rel1_to_x = ed->table_parts[ep->param1.description->rel1.id_x % ed->table_parts_size];
if (ep->param1.description->rel1.id_y >= 0) if (ep->param1.description->rel1.id_y >= 0)
ep->param1.rel1_to_y = evas_list_nth(ed->parts, ep->param1.description->rel1.id_y); ep->param1.rel1_to_y = ed->table_parts[ep->param1.description->rel1.id_y % ed->table_parts_size];
if (ep->param1.description->rel2.id_x >= 0) if (ep->param1.description->rel2.id_x >= 0)
ep->param1.rel2_to_x = evas_list_nth(ed->parts, ep->param1.description->rel2.id_x); ep->param1.rel2_to_x = ed->table_parts[ep->param1.description->rel2.id_x % ed->table_parts_size];
if (ep->param1.description->rel2.id_y >= 0) if (ep->param1.description->rel2.id_y >= 0)
ep->param1.rel2_to_y = evas_list_nth(ed->parts, ep->param1.description->rel2.id_y); ep->param1.rel2_to_y = ed->table_parts[ep->param1.description->rel2.id_y % ed->table_parts_size];
} }
ep->param2.rel1_to_x = NULL; ep->param2.rel1_to_x = NULL;
ep->param2.rel1_to_y = NULL; ep->param2.rel1_to_y = NULL;
@ -165,13 +165,13 @@ _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, char *d1, double v1,
if (ep->param2.description) if (ep->param2.description)
{ {
if (ep->param2.description->rel1.id_x >= 0) if (ep->param2.description->rel1.id_x >= 0)
ep->param2.rel1_to_x = evas_list_nth(ed->parts, ep->param2.description->rel1.id_x); 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) if (ep->param2.description->rel1.id_y >= 0)
ep->param2.rel1_to_y = evas_list_nth(ed->parts, ep->param2.description->rel1.id_y); 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) if (ep->param2.description->rel2.id_x >= 0)
ep->param2.rel2_to_x = evas_list_nth(ed->parts, ep->param2.description->rel2.id_x); 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) if (ep->param2.description->rel2.id_y >= 0)
ep->param2.rel2_to_y = evas_list_nth(ed->parts, ep->param2.description->rel2.id_y); ep->param2.rel2_to_y = ed->table_parts[ep->param2.description->rel2.id_y % ed->table_parts_size];
} }
ed->dirty = 1; ed->dirty = 1;

View File

@ -13,6 +13,7 @@ int
edje_object_file_set(Evas_Object *obj, const char *file, const char *part) edje_object_file_set(Evas_Object *obj, const char *file, const char *part)
{ {
Edje *ed; Edje *ed;
int n;
ed = _edje_fetch(obj); ed = _edje_fetch(obj);
if (!ed) return 0; if (!ed) return 0;
@ -85,7 +86,7 @@ edje_object_file_set(Evas_Object *obj, const char *file, const char *part)
hist = NULL; hist = NULL;
} }
/* build real parts */ /* build real parts */
for (l = ed->collection->parts; l; l = l->next) for (n = 0, l = ed->collection->parts; l; l = l->next, n++)
{ {
Edje_Part *ep; Edje_Part *ep;
Edje_Real_Part *rp; Edje_Real_Part *rp;
@ -152,36 +153,61 @@ edje_object_file_set(Evas_Object *obj, const char *file, const char *part)
rp->drag.step.x = ep->dragable.step_x; rp->drag.step.x = ep->dragable.step_x;
rp->drag.step.y = ep->dragable.step_y; rp->drag.step.y = ep->dragable.step_y;
} }
for (l = ed->parts; l; l = l->next) if (n > 0)
{ {
Edje_Real_Part *rp; ed->table_parts = malloc(sizeof(Edje_Real_Part *) * n);
ed->table_parts_size = n;
rp = l->data; /* FIXME: check malloc return */
if (rp->param1.description->rel1.id_x >= 0) n = 0;
rp->param1.rel1_to_x = evas_list_nth(ed->parts, rp->param1.description->rel1.id_x); for (l = ed->parts; l; l = l->next)
if (rp->param1.description->rel1.id_y >= 0)
rp->param1.rel1_to_y = evas_list_nth(ed->parts, rp->param1.description->rel1.id_y);
if (rp->param1.description->rel2.id_x >= 0)
rp->param1.rel2_to_x = evas_list_nth(ed->parts, rp->param1.description->rel2.id_x);
if (rp->param1.description->rel2.id_y >= 0)
rp->param1.rel2_to_y = evas_list_nth(ed->parts, rp->param1.description->rel2.id_y);
_edje_text_part_on_add_clippers(ed, rp);
if (rp->part->clip_to_id >= 0)
{ {
rp->clip_to = evas_list_nth(ed->parts, rp->part->clip_to_id); Edje_Real_Part *rp;
if (rp->clip_to)
rp = l->data;
ed->table_parts[n] = rp;
n++;
if (rp->param1.description->rel1.id_x >= 0)
rp->param1.rel1_to_x = evas_list_nth(ed->parts, rp->param1.description->rel1.id_x);
if (rp->param1.description->rel1.id_y >= 0)
rp->param1.rel1_to_y = evas_list_nth(ed->parts, rp->param1.description->rel1.id_y);
if (rp->param1.description->rel2.id_x >= 0)
rp->param1.rel2_to_x = evas_list_nth(ed->parts, rp->param1.description->rel2.id_x);
if (rp->param1.description->rel2.id_y >= 0)
rp->param1.rel2_to_y = evas_list_nth(ed->parts, rp->param1.description->rel2.id_y);
_edje_text_part_on_add_clippers(ed, rp);
if (rp->part->clip_to_id >= 0)
{ {
evas_object_pass_events_set(rp->clip_to->object, 1); rp->clip_to = evas_list_nth(ed->parts, rp->part->clip_to_id);
evas_object_clip_set(rp->object, rp->clip_to->object); if (rp->clip_to)
{
evas_object_pass_events_set(rp->clip_to->object, 1);
evas_object_clip_set(rp->object, rp->clip_to->object);
}
} }
if (rp->part->dragable.confine_id >= 0)
rp->confine_to = evas_list_nth(ed->parts, rp->part->dragable.confine_id);
rp->swallow_params.min.w = 0;
rp->swallow_params.min.w = 0;
rp->swallow_params.max.w = -1;
rp->swallow_params.max.h = -1;
}
}
n = evas_list_count(ed->collection->programs);
if (n > 0)
{
ed->table_programs = malloc(sizeof(Edje_Program *) * n);
ed->table_programs_size = n;
/* FIXME: check malloc return */
n = 0;
for (l = ed->collection->programs; l; l = l->next)
{
Edje_Program *pr;
pr = l->data;
ed->table_programs[n] = pr;
n++;
} }
if (rp->part->dragable.confine_id >= 0)
rp->confine_to = evas_list_nth(ed->parts, rp->part->dragable.confine_id);
rp->swallow_params.min.w = 0;
rp->swallow_params.min.w = 0;
rp->swallow_params.max.w = -1;
rp->swallow_params.max.h = -1;
} }
_edje_ref(ed); _edje_ref(ed);
_edje_block(ed); _edje_block(ed);
@ -537,6 +563,12 @@ _edje_file_del(Edje *ed)
free(pp); free(pp);
} }
} }
if (ed->table_parts) free(ed->table_parts);
ed->table_parts = NULL;
ed->table_parts_size = 0;
if (ed->table_programs) free(ed->table_programs);
ed->table_programs = NULL;
ed->table_programs_size = 0;
} }
void void

View File

@ -0,0 +1,4 @@
#include "Edje.h"
#include "edje_private.h"
/* nothing in here yet */

View File

@ -228,9 +228,12 @@ _edje_program_run_iterate(Edje_Running_Program *runp, double tim)
Edje_Program_Target *pt; Edje_Program_Target *pt;
pt = l->data; pt = l->data;
rp = evas_list_nth(ed->parts, pt->id); if (pt->id >= 0)
if (rp) _edje_part_pos_set(ed, rp, {
runp->program->tween.mode, t); rp = ed->table_parts[pt->id % ed->table_parts_size];
if (rp) _edje_part_pos_set(ed, rp,
runp->program->tween.mode, t);
}
} }
if (t >= 1.0) if (t >= 1.0)
{ {
@ -240,17 +243,20 @@ _edje_program_run_iterate(Edje_Running_Program *runp, double tim)
Edje_Program_Target *pt; Edje_Program_Target *pt;
pt = l->data; pt = l->data;
rp = evas_list_nth(ed->parts, pt->id); if (pt->id >= 0)
if (rp)
{ {
_edje_part_description_apply(ed, rp, rp = ed->table_parts[pt->id % ed->table_parts_size];
runp->program->state, if (rp)
runp->program->value, {
NULL, _edje_part_description_apply(ed, rp,
0.0); runp->program->state,
_edje_part_pos_set(ed, rp, runp->program->value,
runp->program->tween.mode, 0.0); NULL,
rp->program = NULL; 0.0);
_edje_part_pos_set(ed, rp,
runp->program->tween.mode, 0.0);
rp->program = NULL;
}
} }
} }
_edje_recalc(ed); _edje_recalc(ed);
@ -275,7 +281,7 @@ _edje_program_run_iterate(Edje_Running_Program *runp, double tim)
if (pa->id >= 0) if (pa->id >= 0)
{ {
pr = evas_list_nth(ed->collection->programs, pa->id); pr = ed->table_programs[pa->id % ed->table_programs_size];
if (pr) _edje_program_run(ed, pr, 0, "", ""); if (pr) _edje_program_run(ed, pr, 0, "", "");
if (_edje_block_break(ed)) if (_edje_block_break(ed))
{ {
@ -313,17 +319,20 @@ _edje_program_end(Edje *ed, Edje_Running_Program *runp)
Edje_Program_Target *pt; Edje_Program_Target *pt;
pt = l->data; pt = l->data;
rp = evas_list_nth(ed->parts, pt->id); if (pt->id >= 0)
if (rp)
{ {
_edje_part_description_apply(ed, rp, rp = ed->table_parts[pt->id % ed->table_parts_size];
runp->program->state, if (rp)
runp->program->value, {
NULL, _edje_part_description_apply(ed, rp,
0.0); runp->program->state,
_edje_part_pos_set(ed, rp, runp->program->value,
runp->program->tween.mode, 0.0); NULL,
rp->program = NULL; 0.0);
_edje_part_pos_set(ed, rp,
runp->program->tween.mode, 0.0);
rp->program = NULL;
}
} }
} }
_edje_recalc(ed); _edje_recalc(ed);
@ -397,18 +406,21 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force, char *ssig, char *ssrc)
Edje_Program_Target *pt; Edje_Program_Target *pt;
pt = l->data; pt = l->data;
rp = evas_list_nth(ed->parts, pt->id); if (pt->id >= 0)
if (rp)
{ {
if (rp->program) rp = ed->table_parts[pt->id % ed->table_parts_size];
_edje_program_end(ed, rp->program); if (rp)
_edje_part_description_apply(ed, rp, {
rp->param1.description->state.name, if (rp->program)
rp->param1.description->state.value, _edje_program_end(ed, rp->program);
pr->state, _edje_part_description_apply(ed, rp,
pr->value); rp->param1.description->state.name,
_edje_part_pos_set(ed, rp, pr->tween.mode, 0.0); rp->param1.description->state.value,
rp->program = runp; pr->state,
pr->value);
_edje_part_pos_set(ed, rp, pr->tween.mode, 0.0);
rp->program = runp;
}
} }
} }
_edje_emit(ed, "program,start", pr->name); _edje_emit(ed, "program,start", pr->name);
@ -435,17 +447,20 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force, char *ssig, char *ssrc)
Edje_Program_Target *pt; Edje_Program_Target *pt;
pt = l->data; pt = l->data;
rp = evas_list_nth(ed->parts, pt->id); if (pt->id >= 0)
if (rp)
{ {
if (rp->program) rp = ed->table_parts[pt->id % ed->table_parts_size];
_edje_program_end(ed, rp->program); if (rp)
_edje_part_description_apply(ed, rp, {
pr->state, if (rp->program)
pr->value, _edje_program_end(ed, rp->program);
NULL, _edje_part_description_apply(ed, rp,
0.0); pr->state,
_edje_part_pos_set(ed, rp, pr->tween.mode, 0.0); pr->value,
NULL,
0.0);
_edje_part_pos_set(ed, rp, pr->tween.mode, 0.0);
}
} }
} }
_edje_emit(ed, "program,start", pr->name); _edje_emit(ed, "program,start", pr->name);
@ -460,7 +475,7 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force, char *ssig, char *ssrc)
if (pa->id >= 0) if (pa->id >= 0)
{ {
pr2 = evas_list_nth(ed->collection->programs, pa->id); pr2 = ed->table_programs[pa->id % ed->table_programs_size];
if (pr2) _edje_program_run(ed, pr2, 0, "", ""); if (pr2) _edje_program_run(ed, pr2, 0, "", "");
if (_edje_block_break(ed)) goto break_prog; if (_edje_block_break(ed)) goto break_prog;
} }
@ -526,18 +541,21 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force, char *ssig, char *ssrc)
Edje_Program_Target *pt; Edje_Program_Target *pt;
pt = l->data; pt = l->data;
rp = evas_list_nth(ed->parts, pt->id); if (pt->id >= 0)
if ((rp) && (rp->drag.down.count == 0))
{ {
rp->drag.val.x = pr->value; rp = ed->table_parts[pt->id % ed->table_parts_size];
rp->drag.val.y = pr->value2; if ((rp) && (rp->drag.down.count == 0))
if (rp->drag.val.x < 0.0) rp->drag.val.x = 0.0; {
else if (rp->drag.val.x > 1.0) rp->drag.val.x = 1.0; rp->drag.val.x = pr->value;
if (rp->drag.val.y < 0.0) rp->drag.val.y = 0.0; rp->drag.val.y = pr->value2;
else if (rp->drag.val.y > 1.0) rp->drag.val.y = 1.0; if (rp->drag.val.x < 0.0) rp->drag.val.x = 0.0;
_edje_dragable_pos_set(ed, rp, rp->drag.val.x, rp->drag.val.y); else if (rp->drag.val.x > 1.0) rp->drag.val.x = 1.0;
_edje_emit(ed, "drag,set", rp->part->name); if (rp->drag.val.y < 0.0) rp->drag.val.y = 0.0;
if (_edje_block_break(ed)) goto break_prog; else if (rp->drag.val.y > 1.0) rp->drag.val.y = 1.0;
_edje_dragable_pos_set(ed, rp, rp->drag.val.x, rp->drag.val.y);
_edje_emit(ed, "drag,set", rp->part->name);
if (_edje_block_break(ed)) goto break_prog;
}
} }
} }
_edje_emit(ed, "program,stop", pr->name); _edje_emit(ed, "program,stop", pr->name);
@ -553,18 +571,21 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force, char *ssig, char *ssrc)
Edje_Program_Target *pt; Edje_Program_Target *pt;
pt = l->data; pt = l->data;
rp = evas_list_nth(ed->parts, pt->id); if (pt->id >= 0)
if ((rp) && (rp->drag.down.count == 0))
{ {
rp->drag.val.x += pr->value * rp->drag.step.x * rp->part->dragable.x; rp = ed->table_parts[pt->id % ed->table_parts_size];
rp->drag.val.y += pr->value2 * rp->drag.step.y * rp->part->dragable.y; if ((rp) && (rp->drag.down.count == 0))
if (rp->drag.val.x < 0.0) rp->drag.val.x = 0.0; {
else if (rp->drag.val.x > 1.0) rp->drag.val.x = 1.0; rp->drag.val.x += pr->value * rp->drag.step.x * rp->part->dragable.x;
if (rp->drag.val.y < 0.0) rp->drag.val.y = 0.0; rp->drag.val.y += pr->value2 * rp->drag.step.y * rp->part->dragable.y;
else if (rp->drag.val.y > 1.0) rp->drag.val.y = 1.0; if (rp->drag.val.x < 0.0) rp->drag.val.x = 0.0;
_edje_dragable_pos_set(ed, rp, rp->drag.val.x, rp->drag.val.y); else if (rp->drag.val.x > 1.0) rp->drag.val.x = 1.0;
_edje_emit(ed, "drag,step", rp->part->name); if (rp->drag.val.y < 0.0) rp->drag.val.y = 0.0;
if (_edje_block_break(ed)) goto break_prog; else if (rp->drag.val.y > 1.0) rp->drag.val.y = 1.0;
_edje_dragable_pos_set(ed, rp, rp->drag.val.x, rp->drag.val.y);
_edje_emit(ed, "drag,step", rp->part->name);
if (_edje_block_break(ed)) goto break_prog;
}
} }
} }
_edje_emit(ed, "program,stop", pr->name); _edje_emit(ed, "program,stop", pr->name);
@ -580,18 +601,21 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force, char *ssig, char *ssrc)
Edje_Program_Target *pt; Edje_Program_Target *pt;
pt = l->data; pt = l->data;
rp = evas_list_nth(ed->parts, pt->id); if (pt->id >= 0)
if ((rp) && (rp->drag.down.count == 0))
{ {
rp->drag.val.x += pr->value * rp->drag.page.x * rp->part->dragable.x; rp = ed->table_parts[pt->id % ed->table_parts_size];
rp->drag.val.y += pr->value2 * rp->drag.step.y * rp->part->dragable.y; if ((rp) && (rp->drag.down.count == 0))
if (rp->drag.val.x < 0.0) rp->drag.val.x = 0.0; {
else if (rp->drag.val.x > 1.0) rp->drag.val.x = 1.0; rp->drag.val.x += pr->value * rp->drag.page.x * rp->part->dragable.x;
if (rp->drag.val.y < 0.0) rp->drag.val.y = 0.0; rp->drag.val.y += pr->value2 * rp->drag.step.y * rp->part->dragable.y;
else if (rp->drag.val.y > 1.0) rp->drag.val.y = 1.0; if (rp->drag.val.x < 0.0) rp->drag.val.x = 0.0;
_edje_dragable_pos_set(ed, rp, rp->drag.val.x, rp->drag.val.y); else if (rp->drag.val.x > 1.0) rp->drag.val.x = 1.0;
_edje_emit(ed, "drag,page", rp->part->name); if (rp->drag.val.y < 0.0) rp->drag.val.y = 0.0;
if (_edje_block_break(ed)) goto break_prog; else if (rp->drag.val.y > 1.0) rp->drag.val.y = 1.0;
_edje_dragable_pos_set(ed, rp, rp->drag.val.x, rp->drag.val.y);
_edje_emit(ed, "drag,page", rp->part->name);
if (_edje_block_break(ed)) goto break_prog;
}
} }
} }
_edje_emit(ed, "program,stop", pr->name); _edje_emit(ed, "program,stop", pr->name);
@ -620,9 +644,9 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force, char *ssig, char *ssrc)
if (pa->id >= 0) if (pa->id >= 0)
{ {
pr2 = evas_list_nth(ed->collection->programs, pa->id); pr2 = ed->table_programs[pa->id % ed->table_programs_size];
if (pr2) _edje_program_run(ed, pr2, 0, "", ""); if (pr2) _edje_program_run(ed, pr2, 0, "", "");
if (_edje_block_break(ed)) goto break_prog; if (_edje_block_break(ed)) goto break_prog;
} }
} }
} }