From 48deca95929e18a660d217100a9d135d9694cf2b Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Thu, 3 Apr 2008 18:18:36 +0000 Subject: [PATCH] 1. cedrics patches for speedups. they breka nothing. 2. fix mouse in/out and other event flags stuff again. SVN revision: 34174 --- legacy/edje/src/lib/edje_calc.c | 81 +++++++++++++++++++++++++--- legacy/edje/src/lib/edje_callbacks.c | 18 ++++--- legacy/edje/src/lib/edje_load.c | 20 +++++-- legacy/edje/src/lib/edje_match.c | 7 +-- 4 files changed, 103 insertions(+), 23 deletions(-) diff --git a/legacy/edje/src/lib/edje_calc.c b/legacy/edje/src/lib/edje_calc.c index 8b390bf651..3196243639 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) { @@ -1391,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: @@ -1436,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); } } diff --git a/legacy/edje/src/lib/edje_callbacks.c b/legacy/edje/src/lib/edje_callbacks.c index 0cb45bf691..0c01223c44 100644 --- a/legacy/edje/src/lib/edje_callbacks.c +++ b/legacy/edje/src/lib/edje_callbacks.c @@ -34,7 +34,9 @@ _edje_mouse_in_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) ev = event_info; ed = data; rp = evas_object_data_get(obj, "real_part"); - if (!rp || !(rp->part->ignore_flags & ev->event_flags)) return; + if ((!rp) || + ((ev->event_flags) && + (!(rp->part->ignore_flags & ev->event_flags)))) return; _edje_emit(ed, "mouse,in", rp->part->name); return; e = NULL; @@ -50,7 +52,9 @@ _edje_mouse_out_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) ev = event_info; ed = data; rp = evas_object_data_get(obj, "real_part"); - if (!rp || !(rp->part->ignore_flags & ev->event_flags)) return; + if ((!rp) || + ((ev->event_flags) && + (!(rp->part->ignore_flags & ev->event_flags)))) return; _edje_emit(ed, "mouse,out", rp->part->name); return; e = NULL; @@ -75,7 +79,7 @@ _edje_mouse_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) _edje_ref(ed); _edje_freeze(ed); - if (!ignored) + if ((ev->event_flags) && (!ignored)) { if (ev->flags & EVAS_BUTTON_TRIPLE_CLICK) snprintf(buf, sizeof(buf), "mouse,down,%i,triple", ev->button); @@ -187,7 +191,7 @@ _edje_mouse_up_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) _edje_ref(ed); _edje_freeze(ed); - if (!ignored) + if ((ev->event_flags) && (!ignored)) { snprintf(buf, sizeof(buf), "mouse,up,%i", ev->button); _edje_emit(ed, buf, rp->part->name); @@ -249,7 +253,7 @@ _edje_mouse_move_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) ignored = rp->part->ignore_flags & ev->event_flags; _edje_ref(ed); - if (!ignored) + if ((ev->event_flags) && (!ignored)) _edje_emit(ed, "mouse,move", rp->part->name); if (rp->still_in) @@ -319,7 +323,9 @@ _edje_mouse_wheel_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) ev = event_info; ed = data; rp = evas_object_data_get(obj, "real_part"); - if (!rp || !(rp->part->ignore_flags & ev->event_flags)) return; + if ((!rp) || + ((ev->event_flags) && + (!(rp->part->ignore_flags & ev->event_flags)))) return; snprintf(buf, sizeof(buf), "mouse,wheel,%i,%i", ev->direction, (ev->z < 0) ? (-1) : (1)); _edje_emit(ed, buf, rp->part->name); 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;