From 334eb3a38983c60f1010c89104fcfefd765523f2 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Sun, 2 Jul 2006 06:18:18 +0000 Subject: [PATCH] cedrics font hash lookup speedup :) SVN revision: 23644 --- legacy/edje/AUTHORS | 1 + legacy/edje/src/lib/edje_cache.c | 45 ++++++++++++++++----- legacy/edje/src/lib/edje_calc.c | 22 +++------- legacy/edje/src/lib/edje_load.c | 3 +- legacy/edje/src/lib/edje_private.h | 2 + legacy/edje/src/lib/edje_text.c | 22 +++------- legacy/edje/src/lib/edje_textblock_styles.c | 17 ++++---- 7 files changed, 60 insertions(+), 52 deletions(-) diff --git a/legacy/edje/AUTHORS b/legacy/edje/AUTHORS index 108b3190ca..b0dab38c7a 100644 --- a/legacy/edje/AUTHORS +++ b/legacy/edje/AUTHORS @@ -1,3 +1,4 @@ The Rasterman (Carsten Haitzler) Tilman Sauerbeck (tilman at code-monkey de) ZigsMcKenzie +Cedric BAIL diff --git a/legacy/edje/src/lib/edje_cache.c b/legacy/edje/src/lib/edje_cache.c index fa83080e80..fdf1fbb300 100644 --- a/legacy/edje/src/lib/edje_cache.c +++ b/legacy/edje/src/lib/edje_cache.c @@ -63,6 +63,32 @@ _edje_file_coll_open(Edje_File *edf, Eet_File *ef, const char *coll) return edc; } +static int +_edje_font_hash (Edje_File *edf) +{ + int count = 0; + + if (edf->font_dir) + { + Evas_List *l; + for (l = edf->font_dir->entries; l; l = evas_list_next (l)) + { + Edje_Font_Directory_Entry *fnt = l->data; + int length = strlen (fnt->entry) + 7; + char *tmp = alloca (length); + + snprintf (tmp, length, "fonts/%s", fnt->entry); + fnt->path = evas_stringshare_add (tmp); + evas_stringshare_del (fnt->entry); + fnt->entry = fnt->path + 6; + edf->font_hash = evas_hash_direct_add (edf->font_hash, fnt->entry, fnt); + + count++; + } + } + return count; +} + static Edje_File * _edje_file_open(const char *file, const char *coll, int *error_ret, Edje_Part_Collection **edc_ret) { @@ -103,18 +129,19 @@ _edje_file_open(const char *file, const char *coll, int *error_ret, Edje_Part_Co _edje_textblock_style_parse_and_fix(edf); - if (!coll) + if (coll) { - eet_close(ef); - return edf; + edc = _edje_file_coll_open(edf, ef, coll); + if (!edc) + { + *error_ret = EDJE_LOAD_ERROR_UNKNOWN_COLLECTION; + } + if (edc_ret) *edc_ret = edc; } + + edf->font_hash = NULL; - edc = _edje_file_coll_open(edf, ef, coll); - if (!edc) - { - *error_ret = EDJE_LOAD_ERROR_UNKNOWN_COLLECTION; - } - if (edc_ret) *edc_ret = edc; + _edje_font_hash (edf); eet_close(ef); return edf; diff --git a/legacy/edje/src/lib/edje_calc.c b/legacy/edje/src/lib/edje_calc.c index ccab2be437..e26cab4c6e 100644 --- a/legacy/edje/src/lib/edje_calc.c +++ b/legacy/edje/src/lib/edje_calc.c @@ -592,24 +592,14 @@ _edje_part_recalc_single(Edje *ed, if (!text) text = ""; /* check if the font is embedded in the .eet */ - /* FIXME: we should cache this result */ - if (ed->file->font_dir) + if (ed->file->font_hash) { - Evas_List *l; - - for (l = ed->file->font_dir->entries; l; l = l->next) - { - Edje_Font_Directory_Entry *fnt = l->data; + Edje_Font_Directory_Entry *fnt = evas_hash_find (ed->file->font_hash, font); - if ((fnt->entry) && (!strcmp(fnt->entry, font))) - { - strcpy(buf, "fonts/"); - strncpy(buf + 6, font, sizeof(buf) - 7); - buf[sizeof(buf) - 1] = 0; - font = buf; - inlined_font = 1; - break; - } + if (fnt) + { + font = fnt->path; + inlined_font = 1; } } if (inlined_font) evas_object_text_font_source_set(ep->object, ed->path); diff --git a/legacy/edje/src/lib/edje_load.c b/legacy/edje/src/lib/edje_load.c index 070c7ea254..c2c6d910da 100644 --- a/legacy/edje/src/lib/edje_load.c +++ b/legacy/edje/src/lib/edje_load.c @@ -612,7 +612,8 @@ _edje_file_free(Edje_File *edf) fe = edf->font_dir->entries->data; edf->font_dir->entries = evas_list_remove(edf->font_dir->entries, fe); - if (fe->entry) evas_stringshare_del(fe->entry); + edf->font_hash = evas_hash_del (edf->font_hash, fe->entry, NULL); + if (fe->path) evas_stringshare_del(fe->path); free(fe); } free(edf->font_dir); diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index d48a0f7365..97df6687e3 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -222,6 +222,7 @@ struct _Edje_File int feature_ver; Evas_Hash *collection_hash; + Evas_Hash *font_hash; Evas_List *collection_cache; }; @@ -259,6 +260,7 @@ struct _Edje_Font_Directory struct _Edje_Font_Directory_Entry { char *entry; /* the name of the font */ + char *path; }; diff --git a/legacy/edje/src/lib/edje_text.c b/legacy/edje/src/lib/edje_text.c index fe28632c94..37ea3f92ee 100644 --- a/legacy/edje/src/lib/edje_text.c +++ b/legacy/edje/src/lib/edje_text.c @@ -284,24 +284,14 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep, if (!font) font = ""; /* check if the font is embedded in the .eet */ - /* FIXME: we should cache this result */ - if (ed->file->font_dir) + if (ed->file->font_hash) { - Evas_List *l; - - for (l = ed->file->font_dir->entries; l; l = l->next) + Edje_Font_Directory_Entry *fnt = evas_hash_find (ed->file->font_hash, font); + + if (fnt) { - Edje_Font_Directory_Entry *fnt = l->data; - - if ((fnt->entry) && (!strcmp(fnt->entry, font))) - { - strcpy(font_buf, "fonts/"); - strncpy(font_buf + 6, font, sizeof(font_buf) - 7); - font_buf[sizeof(font_buf) - 1] = 0; - font = font_buf; - inlined_font = 1; - break; - } + font = fnt->path; + inlined_font = 1; } } diff --git a/legacy/edje/src/lib/edje_textblock_styles.c b/legacy/edje/src/lib/edje_textblock_styles.c index 350ace8f5d..1a4f1b62b5 100644 --- a/legacy/edje/src/lib/edje_textblock_styles.c +++ b/legacy/edje/src/lib/edje_textblock_styles.c @@ -8,17 +8,14 @@ static int _edje_font_is_embedded(Edje_File *edf, char *font) { - Evas_List *l; + if (!edf->font_hash) return 0; + + Edje_Font_Directory_Entry *fnt = evas_hash_find (edf->font_hash, font); - if (!edf->font_dir) return 0; - for (l = edf->font_dir->entries; l; l = l->next) - { - Edje_Font_Directory_Entry *fnt = l->data; - - if ((fnt->entry) && (!strcmp(fnt->entry, font))) - return 1; - } - return 1; + if (fnt) + return 1; + + return 0; } #if 0