Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/edje

Dir     : e17/libs/edje/src/lib


Modified Files:
        Edje_Edit.h Makefile.am edje_calc.c edje_load.c edje_program.c 
Added Files:
        edje_misc.c 


Log Message:


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

===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/Edje_Edit.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -3 -r1.6 -r1.7
--- Edje_Edit.h 30 Mar 2004 10:30:35 -0000      1.6
+++ Edje_Edit.h 1 Apr 2004 15:32:17 -0000       1.7
@@ -425,6 +425,11 @@
    int                   load_error;
    int                   freeze;
    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
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/Makefile.am,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -3 -r1.13 -r1.14
--- Makefile.am 30 Mar 2004 10:30:35 -0000      1.13
+++ Makefile.am 1 Apr 2004 15:32:17 -0000       1.14
@@ -30,6 +30,7 @@
 edje_embryo.c \
 edje_load.c \
 edje_main.c \
+edje_misc.c \
 edje_program.c \
 edje_smart.c \
 edje_text.c \
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_calc.c,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -3 -r1.26 -r1.27
--- edje_calc.c 26 Mar 2004 09:10:05 -0000      1.26
+++ edje_calc.c 1 Apr 2004 15:32:17 -0000       1.27
@@ -91,13 +91,13 @@
    if (ep->param1.description)
      {
        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)
-         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)
-         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)
-         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))
@@ -150,13 +150,13 @@
    if (ep->param1.description)
      {
        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)
-         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)
-         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)
-         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_y = NULL;
@@ -165,13 +165,13 @@
    if (ep->param2.description)
      {
        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)
-         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)
-         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)
-         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;
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_load.c,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -3 -r1.39 -r1.40
--- edje_load.c 30 Mar 2004 10:30:35 -0000      1.39
+++ edje_load.c 1 Apr 2004 15:32:17 -0000       1.40
@@ -13,6 +13,7 @@
 edje_object_file_set(Evas_Object *obj, const char *file, const char *part)
 {
    Edje *ed;
+   int n;
    
    ed = _edje_fetch(obj);
    if (!ed) return 0;
@@ -85,7 +86,7 @@
             hist = NULL;
          }
        /* 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_Real_Part *rp;
@@ -152,36 +153,61 @@
             rp->drag.step.x = ep->dragable.step_x;
             rp->drag.step.y = ep->dragable.step_y;
          }
-       for (l = ed->parts; l; l = l->next)
+       if (n > 0)
          {
-            Edje_Real_Part *rp;
-            
-            rp = l->data;
-            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)
-              {
-                 rp->clip_to = evas_list_nth(ed->parts, rp->part->clip_to_id);
-                 if (rp->clip_to)
+            ed->table_parts = malloc(sizeof(Edje_Real_Part *) * n);
+            ed->table_parts_size = n;
+            /* FIXME: check malloc return */
+            n = 0;
+            for (l = ed->parts; l; l = l->next)
+              {
+                 Edje_Real_Part *rp;
+                 
+                 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);
-                      evas_object_clip_set(rp->object, rp->clip_to->object);
+                      rp->clip_to = evas_list_nth(ed->parts, rp->part->clip_to_id);
+                      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_block(ed);
@@ -537,6 +563,12 @@
             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
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/edje/src/lib/edje_program.c,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -3 -r1.31 -r1.32
--- edje_program.c      28 Mar 2004 05:26:17 -0000      1.31
+++ edje_program.c      1 Apr 2004 15:32:17 -0000       1.32
@@ -228,9 +228,12 @@
        Edje_Program_Target *pt;
        
        pt = l->data;
-       rp = evas_list_nth(ed->parts, pt->id);
-       if (rp) _edje_part_pos_set(ed, rp, 
-                                  runp->program->tween.mode, t);
+       if (pt->id >= 0)
+         {
+            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)
      {
@@ -240,17 +243,20 @@
             Edje_Program_Target *pt;
             
             pt = l->data;
-            rp = evas_list_nth(ed->parts, pt->id);
-            if (rp)
+            if (pt->id >= 0)
               {
-                 _edje_part_description_apply(ed, rp, 
-                                              runp->program->state, 
-                                              runp->program->value,
-                                              NULL,
-                                              0.0);
-                 _edje_part_pos_set(ed, rp, 
-                                    runp->program->tween.mode, 0.0);
-                 rp->program = NULL;
+                 rp = ed->table_parts[pt->id % ed->table_parts_size];
+                 if (rp)
+                   {
+                      _edje_part_description_apply(ed, rp, 
+                                                   runp->program->state, 
+                                                   runp->program->value,
+                                                   NULL,
+                                                   0.0);
+                      _edje_part_pos_set(ed, rp, 
+                                         runp->program->tween.mode, 0.0);
+                      rp->program = NULL;
+                   }
               }
          }
        _edje_recalc(ed);
@@ -275,7 +281,7 @@
             
             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 (_edje_block_break(ed))
                    {
@@ -313,17 +319,20 @@
        Edje_Program_Target *pt;
        
        pt = l->data;
-       rp = evas_list_nth(ed->parts, pt->id);
-       if (rp)
+       if (pt->id >= 0)
          {
-            _edje_part_description_apply(ed, rp, 
-                                         runp->program->state, 
-                                         runp->program->value,
-                                         NULL,
-                                         0.0);
-            _edje_part_pos_set(ed, rp, 
-                               runp->program->tween.mode, 0.0);
-            rp->program = NULL;
+            rp = ed->table_parts[pt->id % ed->table_parts_size];
+            if (rp)
+              {
+                 _edje_part_description_apply(ed, rp, 
+                                              runp->program->state, 
+                                              runp->program->value,
+                                              NULL,
+                                              0.0);
+                 _edje_part_pos_set(ed, rp, 
+                                    runp->program->tween.mode, 0.0);
+                 rp->program = NULL;
+              }
          }
      }
    _edje_recalc(ed);
@@ -397,18 +406,21 @@
                  Edje_Program_Target *pt;
                  
                  pt = l->data;
-                 rp = evas_list_nth(ed->parts, pt->id);
-                 if (rp)
+                 if (pt->id >= 0)
                    {
-                      if (rp->program)
-                        _edje_program_end(ed, rp->program);
-                      _edje_part_description_apply(ed, rp, 
-                                                   rp->param1.description->state.name,
-                                                   
rp->param1.description->state.value, 
-                                                   pr->state, 
-                                                   pr->value);
-                      _edje_part_pos_set(ed, rp, pr->tween.mode, 0.0);
-                      rp->program = runp;
+                      rp = ed->table_parts[pt->id % ed->table_parts_size];
+                      if (rp)
+                        {
+                           if (rp->program)
+                             _edje_program_end(ed, rp->program);
+                           _edje_part_description_apply(ed, rp, 
+                                                        
rp->param1.description->state.name,
+                                                        
rp->param1.description->state.value, 
+                                                        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);
@@ -435,17 +447,20 @@
                  Edje_Program_Target *pt;
                  
                  pt = l->data;
-                 rp = evas_list_nth(ed->parts, pt->id);
-                 if (rp)
+                 if (pt->id >= 0)
                    {
-                      if (rp->program)
-                        _edje_program_end(ed, rp->program);
-                      _edje_part_description_apply(ed, rp, 
-                                                   pr->state, 
-                                                   pr->value,
-                                                   NULL,
-                                                   0.0);
-                      _edje_part_pos_set(ed, rp, pr->tween.mode, 0.0);
+                      rp = ed->table_parts[pt->id % ed->table_parts_size];
+                      if (rp)
+                        {
+                           if (rp->program)
+                             _edje_program_end(ed, rp->program);
+                           _edje_part_description_apply(ed, rp, 
+                                                        pr->state, 
+                                                        pr->value,
+                                                        NULL,
+                                                        0.0);
+                           _edje_part_pos_set(ed, rp, pr->tween.mode, 0.0);
+                        }
                    }
               }
             _edje_emit(ed, "program,start", pr->name);
@@ -460,7 +475,7 @@
                 
                  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 (_edje_block_break(ed)) goto break_prog;
                    }
@@ -526,18 +541,21 @@
             Edje_Program_Target *pt;
             
             pt = l->data;
-            rp = evas_list_nth(ed->parts, pt->id);
-            if ((rp) && (rp->drag.down.count == 0))
+            if (pt->id >= 0)
               {
-                 rp->drag.val.x = pr->value;
-                 rp->drag.val.y = pr->value2;
-                 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;
-                 if      (rp->drag.val.y < 0.0) rp->drag.val.y = 0.0;
-                 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;
+                 rp = ed->table_parts[pt->id % ed->table_parts_size];
+                 if ((rp) && (rp->drag.down.count == 0))
+                   {
+                      rp->drag.val.x = pr->value;
+                      rp->drag.val.y = pr->value2;
+                      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;
+                      if      (rp->drag.val.y < 0.0) rp->drag.val.y = 0.0;
+                      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);
@@ -553,18 +571,21 @@
             Edje_Program_Target *pt;
             
             pt = l->data;
-            rp = evas_list_nth(ed->parts, pt->id);
-            if ((rp) && (rp->drag.down.count == 0))
+            if (pt->id >= 0)
               {
-                 rp->drag.val.x += pr->value * rp->drag.step.x * rp->part->dragable.x;
-                 rp->drag.val.y += pr->value2 * rp->drag.step.y * 
rp->part->dragable.y;
-                 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;
-                 if      (rp->drag.val.y < 0.0) rp->drag.val.y = 0.0;
-                 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;
+                 rp = ed->table_parts[pt->id % ed->table_parts_size];
+                 if ((rp) && (rp->drag.down.count == 0))
+                   {
+                      rp->drag.val.x += pr->value * rp->drag.step.x * 
rp->part->dragable.x;
+                      rp->drag.val.y += pr->value2 * rp->drag.step.y * 
rp->part->dragable.y;
+                      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;
+                      if      (rp->drag.val.y < 0.0) rp->drag.val.y = 0.0;
+                      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);
@@ -580,18 +601,21 @@
             Edje_Program_Target *pt;
             
             pt = l->data;
-            rp = evas_list_nth(ed->parts, pt->id);
-            if ((rp) && (rp->drag.down.count == 0))
+            if (pt->id >= 0)
               {
-                 rp->drag.val.x += pr->value * rp->drag.page.x * rp->part->dragable.x;
-                 rp->drag.val.y += pr->value2 * rp->drag.step.y * 
rp->part->dragable.y;
-                 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;
-                 if      (rp->drag.val.y < 0.0) rp->drag.val.y = 0.0;
-                 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;
+                 rp = ed->table_parts[pt->id % ed->table_parts_size];
+                 if ((rp) && (rp->drag.down.count == 0))
+                   {
+                      rp->drag.val.x += pr->value * rp->drag.page.x * 
rp->part->dragable.x;
+                      rp->drag.val.y += pr->value2 * rp->drag.step.y * 
rp->part->dragable.y;
+                      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;
+                      if      (rp->drag.val.y < 0.0) rp->drag.val.y = 0.0;
+                      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);
@@ -620,9 +644,9 @@
             
             if (pa->id >= 0)
               {
-               pr2 = evas_list_nth(ed->collection->programs, pa->id);
-               if (pr2) _edje_program_run(ed, pr2, 0, "", "");
-               if (_edje_block_break(ed)) goto break_prog;
+                 pr2 = ed->table_programs[pa->id % ed->table_programs_size];
+                 if (pr2) _edje_program_run(ed, pr2, 0, "", "");
+                 if (_edje_block_break(ed)) goto break_prog;
               }
          }
      }




-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to