From 0e4c0eb8ecf7f0d370dfe0d4b91afa862d6dafe9 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Thu, 10 Apr 2008 08:58:19 +0000 Subject: [PATCH] cedric small speedups patches for edje back in - minus the ones that break things. (0004). SVN revision: 34234 --- legacy/edje/src/lib/edje_calc.c | 61 +++++++++++++++++++++++++++++++- legacy/edje/src/lib/edje_load.c | 20 ++++++++--- legacy/edje/src/lib/edje_match.c | 7 ++-- 3 files changed, 77 insertions(+), 11 deletions(-) diff --git a/legacy/edje/src/lib/edje_calc.c b/legacy/edje/src/lib/edje_calc.c index 8b390bf651..972f89b238 100644 --- a/legacy/edje/src/lib/edje_calc.c +++ b/legacy/edje/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) { diff --git a/legacy/edje/src/lib/edje_load.c b/legacy/edje/src/lib/edje_load.c index cc659d9c74..0117e14471 100644 --- a/legacy/edje/src/lib/edje_load.c +++ b/legacy/edje/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); } diff --git a/legacy/edje/src/lib/edje_match.c b/legacy/edje/src/lib/edje_match.c index 224051981f..b398e5dc67 100644 --- a/legacy/edje/src/lib/edje_match.c +++ b/legacy/edje/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;