From 44ba936c9c480e7090e802e3e549386b68d61a7b Mon Sep 17 00:00:00 2001 From: Rafael Antognolli Date: Wed, 23 May 2012 18:10:39 +0000 Subject: [PATCH] evas/cserve2: Add basic font search when a font load is requested. This will only look for fonts already loaded before, no new fonts will be loaded. SVN revision: 71365 --- legacy/evas/src/bin/evas_cserve2.h | 5 ++ legacy/evas/src/bin/evas_cserve2_cache.c | 80 ++++++++++++++++++++++++ legacy/evas/src/bin/evas_cserve2_main.c | 9 ++- 3 files changed, 91 insertions(+), 3 deletions(-) diff --git a/legacy/evas/src/bin/evas_cserve2.h b/legacy/evas/src/bin/evas_cserve2.h index 4be8a058bc..39ee7ceab3 100644 --- a/legacy/evas/src/bin/evas_cserve2.h +++ b/legacy/evas/src/bin/evas_cserve2.h @@ -47,6 +47,9 @@ struct _Client { struct { Eina_Hash *referencing; // indexed by client image id } images; + struct { + Eina_List *referencing; + } fonts; }; typedef struct _Client Client; @@ -171,6 +174,8 @@ void cserve2_cache_image_load(Client *client, unsigned int client_image_id, unsi void cserve2_cache_image_preload(Client *client, unsigned int client_image_id, unsigned int rid); void cserve2_cache_image_unload(Client *client, unsigned int client_image_id); +int cserve2_cache_font_load(Client *client, const char *name, unsigned int namelen, unsigned int rend_flags, unsigned int hint, unsigned int size, unsigned int dpi, unsigned int rid); + void cserve2_cache_requests_process(void); void cserve2_cache_requests_response(Slave_Command type, void *msg, void *data); diff --git a/legacy/evas/src/bin/evas_cserve2_cache.c b/legacy/evas/src/bin/evas_cserve2_cache.c index b4427251fc..d0e0fe7ef0 100644 --- a/legacy/evas/src/bin/evas_cserve2_cache.c +++ b/legacy/evas/src/bin/evas_cserve2_cache.c @@ -233,6 +233,22 @@ _image_preloaded_send(Client *client, unsigned int rid) cserve2_client_send(client, &msg, size); } +static void +_font_loaded_send(Client *client, Font_Entry *fe __UNUSED__, unsigned int rid) +{ + int size; + Msg_Font_Loaded msg; + + DBG("Sending FONT_LOADED reply for RID: %d.", rid); + memset(&msg, 0, sizeof(msg)); + msg.base.rid = rid; + msg.base.type = CSERVE2_FONT_LOADED; + + size = sizeof(msg); + cserve2_client_send(client, &size, sizeof(size)); + cserve2_client_send(client, &msg, size); +} + static void * _open_request_build(File_Data *f, int *bufsize) { @@ -893,6 +909,11 @@ _entry_reference_del(Entry *entry, Reference *ref) else _entry_unused_push(ientry); } + else if (entry->type == CSERVE2_FONT_ENTRY) + { + Font_Entry *fe = (Font_Entry *)entry; + eina_hash_del_by_key(font_entries, fe); + } else ERR("Wrong type of entry."); @@ -930,20 +951,36 @@ _entry_free_cb(void *data) _entry_reference_del(entry, ref); } +static void +_font_entry_reference_del(Client *client, Reference *ref) +{ + Entry *entry = ref->entry; + + _entry_reference_del(entry, ref); +} + void cserve2_cache_client_new(Client *client) { client->files.referencing = eina_hash_int32_new(_entry_free_cb); client->images.referencing = eina_hash_int32_new(_entry_free_cb); + client->fonts.referencing = NULL; } void cserve2_cache_client_del(Client *client) { + Reference *ref; + // will call _entry_free_cb() for every entry eina_hash_free(client->images.referencing); // will call _entry_free_cb() for every entry eina_hash_free(client->files.referencing); + + EINA_LIST_FREE(client->fonts.referencing, ref) + { + _font_entry_reference_del(client, ref); + } } static Image_Data * @@ -1031,6 +1068,26 @@ _file_changed_cb(const char *path __UNUSED__, Eina_Bool deleted __UNUSED__, void eina_hash_del_by_key(file_watch, fw->path); } +static Font_Entry * +_cserve2_font_entry_find(const char *name, unsigned int namelen, unsigned int size, unsigned int rend_flags, unsigned int hint, unsigned int dpi) +{ + Font_Entry tmp_fe; + Font_Source tmp_fs; + Font_Entry *fe; + + tmp_fs.name = eina_stringshare_add_length(name, namelen); + tmp_fe.src = &tmp_fs; + tmp_fe.size = size; + tmp_fe.rend_flags = rend_flags; + tmp_fe.hint = hint; + tmp_fe.dpi = dpi; + + fe = eina_hash_find(font_entries, &tmp_fe); + eina_stringshare_del(tmp_fs.name); + + return fe; +} + int cserve2_cache_file_open(Client *client, unsigned int client_file_id, const char *path, const char *key, unsigned int rid) { @@ -1321,6 +1378,29 @@ cserve2_cache_image_unload(Client *client, unsigned int client_image_id) eina_hash_del_by_key(client->images.referencing, &client_image_id); } +int +cserve2_cache_font_load(Client *client, const char *name, unsigned int namelen, unsigned int rend_flags, unsigned int hint, unsigned int size, unsigned int dpi, unsigned int rid) +{ + Reference *ref; + Font_Entry *fe = _cserve2_font_entry_find(name, namelen, size, + rend_flags, hint, dpi); + + if (fe) + { + DBG("found font entry %s, rendflags: %d, hint: %d, size: %d, dpi: %d", + name, rend_flags, hint, size, dpi); + + ref = _entry_reference_add((Entry *)fe, client, 0); + client->fonts.referencing = eina_list_append( + client->fonts.referencing, ref); + + _font_loaded_send(client, fe, rid); + return 0; + } + + return -1; +} + void cserve2_cache_requests_response(Slave_Command type, void *msg, void *data) { diff --git a/legacy/evas/src/bin/evas_cserve2_main.c b/legacy/evas/src/bin/evas_cserve2_main.c index 7d9a721cf1..bbb86c1086 100644 --- a/legacy/evas/src/bin/evas_cserve2_main.c +++ b/legacy/evas/src/bin/evas_cserve2_main.c @@ -270,15 +270,18 @@ static void _cserve2_client_font_load(Client *client) { Msg_Font_Load *msg = (Msg_Font_Load *)client->msg.buf; - char fontpath[PATH_MAX]; + char name[PATH_MAX]; - memcpy(fontpath, msg + 1, msg->pathlen); + memcpy(name, msg + 1, msg->pathlen); INF("Received %s command: RID=%d", (msg->base.type == CSERVE2_FONT_LOAD) ? "FONT_LOAD" : "FONT_UNLOAD", msg->base.rid); INF("Font: %s, rend_flags: %d, hint: %d, size: %d, dpi: %d", - fontpath, msg->rend_flags, msg->hint, msg->size, msg->dpi); + name, msg->rend_flags, msg->hint, msg->size, msg->dpi); + + cserve2_cache_font_load(client, name, msg->pathlen, msg->rend_flags, + msg->hint, msg->size, msg->dpi, msg->base.rid); } static void