cedrics font hash lookup speedup :)

SVN revision: 23644
This commit is contained in:
Carsten Haitzler 2006-07-02 06:18:18 +00:00
parent 5a3be0fd8c
commit 334eb3a389
7 changed files with 60 additions and 52 deletions

View File

@ -1,3 +1,4 @@
The Rasterman (Carsten Haitzler) <raster@rasterman.com>
Tilman Sauerbeck (tilman at code-monkey de)
ZigsMcKenzie <zigsmckenzie@gmail.com>
Cedric BAIL <cedric.bail@free.fr>

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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;
};

View File

@ -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;
}
}

View File

@ -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