From ca44473f184c95b88a2dadc02e85bb0806236c05 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Andre Date: Mon, 26 Aug 2013 16:48:49 +0900 Subject: [PATCH] evas/cserve2: Scan glyphs and add to fash This will save (just) a few socket waits. --- src/lib/evas/cserve2/evas_cs2_client.c | 88 +++++++++++++++++++++++-- src/lib/evas/cserve2/evas_cs2_private.h | 3 +- 2 files changed, 86 insertions(+), 5 deletions(-) diff --git a/src/lib/evas/cserve2/evas_cs2_client.c b/src/lib/evas/cserve2/evas_cs2_client.c index 0b036e02f2..cc5458ad02 100644 --- a/src/lib/evas/cserve2/evas_cs2_client.c +++ b/src/lib/evas/cserve2/evas_cs2_client.c @@ -1356,9 +1356,12 @@ _glyph_map_open(Font_Entry *fe, const char *indexpath, const char *datapath) return map; } -static void +static Eina_Bool _glyph_map_remap_check(Glyph_Map *map) { + Eina_Bool changed = EINA_FALSE; + int oldcount; + if (eina_file_refresh(map->mempool.f) || (eina_file_size_get(map->mempool.f) != (size_t) map->mempool.size)) { @@ -1369,7 +1372,78 @@ _glyph_map_remap_check(Glyph_Map *map) map->mempool.size = eina_file_size_get(map->mempool.f); else map->mempool.size = 0; + changed = EINA_TRUE; } + + map->index.generation_id = _index.generation_id; + oldcount = map->index.count; + _shared_index_remap_check(&map->index, sizeof(Glyph_Data)); + changed |= (oldcount != map->index.count); + + return changed; +} + +static int +_font_entry_glyph_map_rebuild_check(Font_Entry *fe, Font_Hint_Flags hints) +{ + Eina_Bool changed = EINA_FALSE; + int cnt = 0; + + if (!fe->map) + { + const Font_Data *fd; + const char *idxpath, *datapath; + + fd = _shared_font_entry_data_find(fe); + if (!fd) return -1; + + idxpath = _shared_string_get(fd->glyph_index_shm); + datapath = _shared_string_get(fd->mempool_shm); + if (!idxpath || !datapath) return -1; + + fe->map =_glyph_map_open(fe, idxpath, datapath); + changed = EINA_TRUE; + } + + changed |= _glyph_map_remap_check(fe->map); + if (changed && fe->map && fe->map->index.data && fe->map->mempool.data) + { + CS_Glyph_Out *gl; + const Glyph_Data *gd; + int k, tot = 0; + + DBG("Rebuilding font hash based on shared index..."); + for (k = 0; k < fe->map->index.count; k++) + { + gd = &(fe->map->index.entries.gldata[k]); + if (!gd->id) break; + if (!gd->refcount) continue; + + tot++; + gl = fash_gl_find(fe->fash[hints], gd->index); + if (gl && gl->base.bitmap.buffer) continue; + + if (!gl) gl = calloc(1, sizeof(*gl)); + gl->map = fe->map; + gl->offset = gd->offset; + gl->size = gd->size; + gl->base.bitmap.rows = gd->rows; + gl->base.bitmap.width = gd->width; + gl->base.bitmap.pitch = gd->pitch; + gl->base.bitmap.buffer = (unsigned char *) + fe->map->mempool.data + gl->offset; + gl->base.bitmap.num_grays = gd->num_grays; + gl->base.bitmap.pixel_mode = gd->pixel_mode; + gl->rid = 0; + + eina_clist_add_head(&fe->map->glyphs, &gl->map_entry); + fash_gl_add(fe->fash[hints], gd->index, gl); + cnt++; + } + DBG("Added %d glyphs to the font hash (out of %d scanned)", cnt, tot); + } + + return cnt; } static void @@ -1668,7 +1742,8 @@ evas_cserve2_font_glyph_used(Font_Entry *fe, unsigned int idx, Font_Hint_Flags h } RGBA_Font_Glyph_Out * -evas_cserve2_font_glyph_bitmap_get(Font_Entry *fe, unsigned int idx, Font_Hint_Flags hints) +evas_cserve2_font_glyph_bitmap_get(Font_Entry *fe, unsigned int idx, + Font_Hint_Flags hints) { Fash_Glyph2 *fash; CS_Glyph_Out *out; @@ -1687,7 +1762,7 @@ evas_cserve2_font_glyph_bitmap_get(Font_Entry *fe, unsigned int idx, Font_Hint_F if (!fash) { // this should not happen really, so let the user know he fucked up - ERR("%s was called with a hinting value that was not requested!", __FUNCTION__); + ERR("was called with a hinting value that was not requested!"); return NULL; } @@ -1696,9 +1771,14 @@ evas_cserve2_font_glyph_bitmap_get(Font_Entry *fe, unsigned int idx, Font_Hint_F { // again, if we are asking for a bitmap we were supposed to already // have requested the glyph, it must be there - ERR("%s was called with a glyph index that was not requested!", __FUNCTION__); + ERR("was called with a glyph index that was not requested!"); return NULL; } + +#if USE_SHARED_INDEX + _font_entry_glyph_map_rebuild_check(fe, hints); +#endif + if (out->rid) _server_dispatch_until(out->rid); diff --git a/src/lib/evas/cserve2/evas_cs2_private.h b/src/lib/evas/cserve2/evas_cs2_private.h index b1719e87f1..8d12e693c7 100644 --- a/src/lib/evas/cserve2/evas_cs2_private.h +++ b/src/lib/evas/cserve2/evas_cs2_private.h @@ -39,10 +39,11 @@ struct _Shared_Index union { const char *p; // Random access - const Index_Entry *index; // TODO for strings + const Index_Entry *index; const Image_Data *idata; const File_Data *filedata; const Font_Data *fontdata; + const Glyph_Data *gldata; } entries; int count; Eina_Hash *entries_by_hkey;