Hi,

  So here are some patch that should not break edje too much.

0001 and 0002: Replace call to snprintf by using memcpy or some kind of itoa.
0003: edje_match can work without the need to call memset.
0004: When edje hide an object, their is no need to move/resize it and
mark it as changed (because when it will be shown again, we will move
it any way). This should delay the update of swallowed object and
could have some border effect I didn't know about. I didn't find any
issue with enlightenment nor the app I am using, but it will be better
if some more people could test this patch.

Have fun,
  Cedric
-- 
Cedric BAIL
From 08d8bdad2c2752d076e4efe9b168df43068bc885 Mon Sep 17 00:00:00 2001
From: Cedric BAIL <[EMAIL PROTECTED]>
Date: Thu, 3 Apr 2008 17:51:38 +0200
Subject: [PATCH] Replace snprintf by faster call to memcpy.

---
 src/lib/edje_load.c |   20 +++++++++++++++-----
 1 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/src/lib/edje_load.c b/src/lib/edje_load.c
index cc659d9..0117e14 100644
--- a/src/lib/edje_load.c
+++ b/src/lib/edje_load.c
@@ -1002,14 +1002,24 @@ _edje_collection_free_prog_cache_matches_free_cb(const Evas_Hash *hash, const ch
 static void
 _cb_signal_repeat(void *data, Evas_Object *obj, const char *signal, const char *source)
 {
-   Evas_Object *parent;
-   Edje *ed;
-   char new_src[4096]; /* XXX is this max reasonable? */
+   Evas_Object	*parent;
+   Edje		*ed;
+   char		 new_src[4096]; /* XXX is this max reasonable? */
+   int		 length_parent;
+   int		 length_source;
 
    parent = data;
    ed = _edje_fetch(obj);
    if (!ed) return;
-   snprintf(new_src, sizeof(new_src), "%s%c%s", ed->parent,
-            EDJE_PART_PATH_SEPARATOR, source);
+   /* Replace snprint("%s%c%s") == memcpy + *new_src + memcat */
+   length_parent = strlen(ed->parent);
+   length_source = strlen(source);
+   if (length_source + length_parent + 2 > sizeof(new_src))
+     return ;
+
+   memcpy(new_src, ed->parent, length_parent);
+   new_src[length_parent] = EDJE_PART_PATH_SEPARATOR;
+   memcpy(new_src + length_parent + 1, source, length_source + 1);
+
    edje_object_signal_emit(parent, signal, new_src);
 }
-- 
1.5.4.GIT

From 32fc1af53975983829504c39f340a9d507506001 Mon Sep 17 00:00:00 2001
From: Cedric BAIL <[EMAIL PROTECTED]>
Date: Thu, 3 Apr 2008 17:54:12 +0200
Subject: [PATCH] Replace snprintf by faster memcpy and own itoa.

---
 src/lib/edje_calc.c |   61 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 60 insertions(+), 1 deletions(-)

diff --git a/src/lib/edje_calc.c b/src/lib/edje_calc.c
index 8b390bf..972f89b 100644
--- a/src/lib/edje_calc.c
+++ b/src/lib/edje_calc.c
@@ -1114,6 +1114,61 @@ _edje_gradient_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3,
      }
 }
 
+static int
+_edje_nitoa_rec(char *string, int len, unsigned int value)
+{
+   const char	*array = "0123456789";
+   int		 length;
+   int		 quotient;
+   int		 modulo;
+
+   if (len <= 0) return 0;
+   if (value == 0) return 0;
+
+   quotient = value / 10;
+   modulo = value % 10;
+
+   length = _edje_nitoa_rec(string, len - 1, quotient);
+
+   if (length + 1 > len) return length;
+
+   string[length] = array[modulo];
+
+   return length + 1;
+}
+
+static int
+_edje_nitoa(char *string, int len, int value)
+{
+   int	length;
+
+   if (len <= 0) return 0;
+   if (len == 1)
+     {
+	*string = '\0';
+	return 1;
+     }
+
+   if (value < 0)
+     {
+	*string = '-';
+
+	++string;
+	--len;
+     }
+
+   if (value == 0)
+     {
+	strncpy(string, "0", len);
+	return 1;
+     }
+
+   length = _edje_nitoa_rec(string, len, value);
+   string[length] = '\0';
+
+   return length;
+}
+
 static void
 _edje_image_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edje_Part_Description *chosen_desc, double pos)
 {
@@ -1173,7 +1228,11 @@ _edje_image_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edj
 	  }
 	else
 	  {
-	     snprintf(buf, sizeof(buf), "images/%i", image_id);
+	     /* Replace snprint("images/%i") == memcpy + itoa */
+#define IMAGES "images/"
+	     memcpy(buf, IMAGES, strlen(IMAGES));
+	     _edje_nitoa(buf + strlen(IMAGES), sizeof(buf) - strlen(IMAGES), image_id);
+
 	     evas_object_image_file_set(ep->object, ed->file->path, buf);
 	     if (evas_object_image_load_error_get(ep->object) != EVAS_LOAD_ERROR_NONE)
 	       {
-- 
1.5.4.GIT

From 0cdace8774ee880b30b0784bcfbbed68930650f2 Mon Sep 17 00:00:00 2001
From: Cedric BAIL <[EMAIL PROTECTED]>
Date: Thu, 3 Apr 2008 17:55:00 +0200
Subject: [PATCH] Remove useless memset.

---
 src/lib/edje_match.c |    7 ++-----
 1 files changed, 2 insertions(+), 5 deletions(-)

diff --git a/src/lib/edje_match.c b/src/lib/edje_match.c
index 2240519..b398e5d 100644
--- a/src/lib/edje_match.c
+++ b/src/lib/edje_match.c
@@ -95,7 +95,7 @@ _edje_match_states_insert(Edje_States    *list,
    {
       const size_t i = idx * (patterns_max_length + 1) + pos;
 
-      if (list->has[i]) return;
+      if (list->size > i && list->has[i]) return;
       list->has[i] = 1;
    }
 
@@ -103,6 +103,7 @@ _edje_match_states_insert(Edje_States    *list,
 
    list->states[i].idx = idx;
    list->states[i].pos = pos;
+   list->has[i] = 0;
    ++list->size;
 }
 
@@ -112,7 +113,6 @@ _edje_match_states_clear(Edje_States     *list,
                          size_t           patterns_max_length)
 {
    list->size = 0;
-   memset(list->has, 0, patterns_size * (patterns_max_length + 1) * sizeof (*list->has));
 }
 
 /* Token manipulation. */
@@ -232,9 +232,6 @@ _edje_match_patterns_exec_init_states(Edje_States       *states,
 
    states->size = patterns_size;
 
-   memset(states->has,
-          0,
-          patterns_size * (patterns_max_length + 1) * sizeof (*states->has));
    for (i = 0; i < patterns_size; ++i)
      {
         states->states[i].idx = i;
-- 
1.5.4.GIT

From 8765e9714aaa218914c4e7f3ef6f87ffb139a3a1 Mon Sep 17 00:00:00 2001
From: Cedric BAIL <[EMAIL PROTECTED]>
Date: Thu, 3 Apr 2008 18:11:15 +0200
Subject: [PATCH] Only move and resize object if they are visible.

This reduce the number of object that are marked changed by edje, and reduce
the number of walk needed by evas in case of swallow/group part. As a result
evas_render is faster as less object are changed.
---
 src/lib/edje_calc.c |   20 ++++++++++++++------
 1 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/src/lib/edje_calc.c b/src/lib/edje_calc.c
index 972f89b..3196243 100644
--- a/src/lib/edje_calc.c
+++ b/src/lib/edje_calc.c
@@ -1450,8 +1450,12 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
 				    (pf->color.g * pf->color.a) / 255,
 				    (pf->color.b * pf->color.a) / 255,
 				    pf->color.a);
-	      if (pf->visible) evas_object_show(ep->object);
-	      else evas_object_hide(ep->object);
+	      if (!pf->visible)
+		{
+		   evas_object_hide(ep->object);
+		   break;
+		}
+	      evas_object_show(ep->object); 
 	      /* move and resize are needed for all previous object => no break here. */
 	   case EDJE_PART_TYPE_SWALLOW:
 	   case EDJE_PART_TYPE_GROUP:
@@ -1495,10 +1499,14 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
 //				   (pf->color.g * pf->color.a) / 255,
 //				   (pf->color.b * pf->color.a) / 255,
 //				   pf->color.a);
-	     evas_object_move(ep->swallowed_object, ed->x + pf->x, ed->y + pf->y);
-	     evas_object_resize(ep->swallowed_object, pf->w, pf->h);
-	     if (pf->visible) evas_object_show(ep->swallowed_object);
-	     else evas_object_hide(ep->swallowed_object);
+	     if (pf->visible)
+	       {
+		  evas_object_show(ep->swallowed_object);
+		  evas_object_move(ep->swallowed_object, ed->x + pf->x, ed->y + pf->y);
+		  evas_object_resize(ep->swallowed_object, pf->w, pf->h);
+	       }
+	     else
+	       evas_object_hide(ep->swallowed_object);
 	  }
      }
 
-- 
1.5.4.GIT

-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to