diff --git a/legacy/evas/README b/legacy/evas/README index 37edb90a67..e90b80b1e8 100644 --- a/legacy/evas/README +++ b/legacy/evas/README @@ -95,7 +95,7 @@ suggested configure options for evas for a P2/AMD/P3/P4 desktop X display: make CFLAGS="-O9 -mpentiumpro -march=pentiumpro -mcpu=pentiumpro" -for those that want eet and edb image loading ability: +for those that want eet and edb image loading ability and eet font loading: ./configure \ --enable-software-x11 \ @@ -103,6 +103,7 @@ for those that want eet and edb image loading ability: --enable-image-loader-jpeg \ --enable-image-loader-eet \ --enable-image-loader-edb \ +--enable-font-loader-eet \ --enable-cpu-p2-only \ --enable-cpu-mmx \ --enable-cpu-sse \ diff --git a/legacy/evas/conf-e-x11.sh b/legacy/evas/conf-e-x11.sh index cb27892410..7ddd8061e6 100755 --- a/legacy/evas/conf-e-x11.sh +++ b/legacy/evas/conf-e-x11.sh @@ -9,6 +9,7 @@ rm config.cache --enable-image-loader-jpeg \ --enable-image-loader-eet \ --enable-image-loader-edb \ +--enable-font-loader-eet \ --enable-cpu-mmx \ --enable-cpu-sse \ --enable-cpu-c \ diff --git a/legacy/evas/configure.in b/legacy/evas/configure.in index faf2f673ef..9e032a74b8 100644 --- a/legacy/evas/configure.in +++ b/legacy/evas/configure.in @@ -405,6 +405,34 @@ if test "x$have_jpeg" = "xyes"; then ) fi +have_eet_fonts=""; + +AC_MSG_CHECKING(whether to enable eet font loader) + +AC_ARG_ENABLE(font-loader-eet, + [ --enable-font-loader-eet enable eet font loader], [ + if [ test "$enableval" = "yes" ]; then + AC_MSG_RESULT(yes) + have_eet_fonts="yes" + else + AC_MSG_RESULT(no) + fi + ], [ + AC_MSG_RESULT(yes) + have_eet_fonts="yes" + ] +) + +if test "x$have_eet_fonts" = "xyes"; then + AC_CHECK_LIB(eet, eet_open, + [ + AC_DEFINE(BUILD_FONT_LOADER_EET, 1, [EET Font Loader Support]) + eet_cflags=`eet-config --cflags` + eet_libs=`eet-config --libs` + ] + ) +fi + have_eet=""; AC_MSG_CHECKING(whether to enable eet image loader) diff --git a/legacy/evas/evas.c.in b/legacy/evas/evas.c.in index 64bb24c5c6..2edb194c73 100644 --- a/legacy/evas/evas.c.in +++ b/legacy/evas/evas.c.in @@ -248,7 +248,8 @@ Suggested configure options for evas for a P2/AMD/P3/P4 desktop X display: make CFLAGS="-O9 -mpentiumpro -march=pentiumpro -mcpu=pentiumpro" @endverbatim -For those that want eet and edb image loading ability: +For those that want eet and edb image loading ability and eet font loading +ability: @verbatim ./configure \ @@ -257,6 +258,7 @@ For those that want eet and edb image loading ability: --enable-image-loader-jpeg \ --enable-image-loader-eet \ --enable-image-loader-edb \ +--enable-font-loader-eet \ --enable-cpu-p2-only \ --enable-cpu-mmx \ --enable-cpu-sse \ diff --git a/legacy/evas/src/lib/Evas.h b/legacy/evas/src/lib/Evas.h index 0c22f84df9..64beb3425c 100644 --- a/legacy/evas/src/lib/Evas.h +++ b/legacy/evas/src/lib/Evas.h @@ -359,6 +359,8 @@ extern "C" { int evas_image_cache_get (Evas *e); Evas_Object *evas_object_text_add (Evas *e); + void evas_object_text_font_source_set (Evas_Object *obj, const char *font); + const char *evas_object_text_font_source_get (Evas_Object *obj); void evas_object_text_font_set (Evas_Object *obj, const char *font, Evas_Font_Size size); void evas_object_text_font_get (Evas_Object *obj, char **font, Evas_Font_Size *size); void evas_object_text_text_set (Evas_Object *obj, const char *text); diff --git a/legacy/evas/src/lib/canvas/evas_object_text.c b/legacy/evas/src/lib/canvas/evas_object_text.c index 29bd3c2e77..28d97357d6 100644 --- a/legacy/evas/src/lib/canvas/evas_object_text.c +++ b/legacy/evas/src/lib/canvas/evas_object_text.c @@ -1,6 +1,9 @@ #include "evas_common.h" #include "evas_private.h" #include "Evas.h" +#ifdef BUILD_FONT_LOADER_EET +#include +#endif /* private magic number for text objects */ static const char o_type[] = "text"; @@ -15,6 +18,7 @@ struct _Evas_Object_Text struct { char *text; char *font; + char *source; Evas_Font_Size size; } cur, prev; char changed : 1; @@ -500,6 +504,53 @@ evas_object_text_add(Evas *e) return obj; } +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +void +evas_object_text_font_source_set(Evas_Object *obj, const char *font_source) +{ + Evas_Object_Text *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return; + MAGIC_CHECK_END(); + if ((o->cur.source) && (font_source) && + (!strcmp(o->cur.source, font_source))) + return; + if (o->cur.source) free(o->cur.source); + if (font_source) o->cur.source = strdup(font_source); + else o->cur.source = NULL; +} + +/** + * To be documented. + * + * FIXME: To be fixed. + * + */ +const char * +evas_object_text_font_source_get(Evas_Object *obj) +{ + Evas_Object_Text *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return NULL; + MAGIC_CHECK_END(); + o = (Evas_Object_Text *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Text, MAGIC_OBJ_TEXT); + return NULL; + MAGIC_CHECK_END(); + return o->cur.source; +} + /** * To be documented. * @@ -542,18 +593,61 @@ evas_object_text_font_set(Evas_Object *obj, const char *font, Evas_Font_Size siz { Evas_List *l; - for (l = obj->layer->evas->font_path; l; l = l->next) +#ifdef BUILD_FONT_LOADER_EET + if (o->cur.source) { - char *f_file; - - f_file = object_text_font_cache_find(l->data, (char *)font); - if (f_file) + Eet_File *ef; + char *fake_name; + + fake_name = evas_file_path_join(o->cur.source, font); + if (fake_name) { - o->engine_data = obj->layer->evas->engine.func->font_load(obj->layer->evas->engine.data.output, - f_file, size); - if (o->engine_data) break; + o->engine_data = + obj->layer->evas->engine.func->font_load + (obj->layer->evas->engine.data.output, fake_name, + size); + if (!o->engine_data) + { + /* read original!!! */ + ef = eet_open(o->cur.source, EET_FILE_MODE_READ); + if (ef) + { + void *fdata; + int fsize = 0; + + fdata = eet_read(ef, font, &fsize); + if ((fdata) && (fsize > 0)) + { + o->engine_data = + obj->layer->evas->engine.func->font_memory_load + (obj->layer->evas->engine.data.output, + fake_name, size, fdata, fsize); + free(fdata); + } + eet_close(ef); + } + } + free(fake_name); } } + if (!o->engine_data) + { +#endif + for (l = obj->layer->evas->font_path; l; l = l->next) + { + char *f_file; + + f_file = object_text_font_cache_find(l->data, (char *)font); + if (f_file) + { + o->engine_data = obj->layer->evas->engine.func->font_load(obj->layer->evas->engine.data.output, + f_file, size); + if (o->engine_data) break; + } + } +#ifdef BUILD_FONT_LOADER_EET + } +#endif } if (o->cur.font) free(o->cur.font); if (font) o->cur.font = strdup(font); @@ -1206,6 +1300,7 @@ evas_object_text_free(Evas_Object *obj) /* free obj */ if (o->cur.text) free(o->cur.text); if (o->cur.font) free(o->cur.font); + if (o->cur.source) free(o->cur.source); if (o->engine_data) obj->layer->evas->engine.func->font_free(obj->layer->evas->engine.data.output, o->engine_data); diff --git a/legacy/evas/src/lib/engines/buffer/evas_engine.c b/legacy/evas/src/lib/engines/buffer/evas_engine.c index e265e42629..d7b33497a8 100644 --- a/legacy/evas/src/lib/engines/buffer/evas_engine.c +++ b/legacy/evas/src/lib/engines/buffer/evas_engine.c @@ -69,6 +69,7 @@ static void evas_engine_buffer_image_cache_flush(void *data); static void evas_engine_buffer_image_cache_set(void *data, int bytes); static int evas_engine_buffer_image_cache_get(void *data); static void *evas_engine_buffer_font_load(void *data, char *name, int size); +static void *evas_engine_buffer_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size); static void evas_engine_buffer_font_free(void *data, void *font); static int evas_engine_buffer_font_ascent_get(void *data, void *font); static int evas_engine_buffer_font_descent_get(void *data, void *font); @@ -154,6 +155,7 @@ Evas_Func evas_engine_buffer_func = evas_engine_buffer_image_cache_get, /* font draw functions */ evas_engine_buffer_font_load, + evas_engine_buffer_font_memory_load, evas_engine_buffer_font_free, evas_engine_buffer_font_ascent_get, evas_engine_buffer_font_descent_get, @@ -925,6 +927,15 @@ evas_engine_buffer_font_load(void *data, char *name, int size) return evas_common_font_load(name, size); } +static void * +evas_engine_buffer_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + return evas_common_font_memory_load(name, size, fdata, fdata_size); +} + static void evas_engine_buffer_font_free(void *data, void *font) { diff --git a/legacy/evas/src/lib/engines/common/evas_font_draw.c b/legacy/evas/src/lib/engines/common/evas_font_draw.c index 2a2c70de81..c986ceac7e 100644 --- a/legacy/evas/src/lib/engines/common/evas_font_draw.c +++ b/legacy/evas/src/lib/engines/common/evas_font_draw.c @@ -17,14 +17,14 @@ evas_common_font_cache_glyph_get(RGBA_Font *fn, FT_UInt index) fg = evas_hash_find(fn->glyphs, key); if (fg) return fg; - error = FT_Load_Glyph(fn->ft.face, index, FT_LOAD_NO_BITMAP); + error = FT_Load_Glyph(fn->src->ft.face, index, FT_LOAD_NO_BITMAP); if (error) return NULL; fg = malloc(sizeof(struct _RGBA_Font_Glyph)); if (!fg) return NULL; memset(fg, 0, (sizeof(struct _RGBA_Font_Glyph))); - error = FT_Get_Glyph(fn->ft.face->glyph, &(fg->glyph)); + error = FT_Get_Glyph(fn->src->ft.face->glyph, &(fg->glyph)); if (error) { free(fg); @@ -90,7 +90,8 @@ evas_common_font_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn, int pen_x = x << 8; pen_y = y << 8; - use_kerning = FT_HAS_KERNING(fn->ft.face); + evas_common_font_size_use(fn); + use_kerning = FT_HAS_KERNING(fn->src->ft.face); prev_index = 0; func = evas_common_draw_func_blend_alpha_get(dst); for (c = 0, chr = 0; text[chr];) @@ -102,12 +103,12 @@ evas_common_font_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn, int gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr); if (gl == 0) break; - index = FT_Get_Char_Index(fn->ft.face, gl); + index = FT_Get_Char_Index(fn->src->ft.face, gl); if ((use_kerning) && (prev_index) && (index)) { FT_Vector delta; - FT_Get_Kerning(fn->ft.face, prev_index, index, + FT_Get_Kerning(fn->src->ft.face, prev_index, index, ft_kerning_default, &delta); pen_x += delta.x << 2; } diff --git a/legacy/evas/src/lib/engines/common/evas_font_load.c b/legacy/evas/src/lib/engines/common/evas_font_load.c index 9dfec993e0..ac1b580892 100644 --- a/legacy/evas/src/lib/engines/common/evas_font_load.c +++ b/legacy/evas/src/lib/engines/common/evas_font_load.c @@ -4,94 +4,236 @@ extern FT_Library evas_ft_lib; static int font_cache_usage = 0; static int font_cache = 0; +static Evas_Object_List * fonts_src = NULL; static Evas_Object_List * fonts = NULL; static int font_modify_cache_cb(Evas_Hash *hash, const char *key, void *data, void *fdata); static int font_flush_free_glyph_cb(Evas_Hash *hash, const char *key, void *data, void *fdata); -/* FIXME: */ -/* we should share face handles and have different ft sizes from the same */ -/* face (if applicable) */ - -RGBA_Font * -evas_common_font_load(const char *name, int size) +RGBA_Font_Source * +evas_common_font_source_memory_load(const char *name, const void *data, int data_size) { int error; + RGBA_Font_Source *fs; + + fs = malloc(sizeof(RGBA_Font_Source)); + if (!fs) return NULL; + fs->name = strdup(name); + fs->file = NULL; + fs->data = malloc(data_size); + if (!fs->data) + { + if (fs->name) free(fs->name); + free(fs); + return NULL; + } + memcpy(fs->data, data, data_size); + fs->data_size = data_size; + error = FT_New_Memory_Face(evas_ft_lib, fs->data, fs->data_size, 0, &(fs->ft.face)); + if (error) + { + if (fs->name) free(fs->name); + if (fs->data) free(fs->data); + free(fs); + return NULL; + } + + fs->references = 1; + + fonts_src = evas_object_list_prepend(fonts_src, fs); + return fs; +} + +RGBA_Font_Source * +evas_common_font_source_load(const char *name) +{ + int error; + RGBA_Font_Source *fs; + + fs = malloc(sizeof(RGBA_Font_Source)); + if (!fs) return NULL; + fs->name = strdup(name); + fs->file = strdup(name); + error = FT_New_Face(evas_ft_lib, fs->file, 0, &(fs->ft.face)); + if (error) + { + if (fs->name) free(fs->name); + if (fs->file) free(fs->file); + free(fs); + return NULL; + } + + fs->references = 1; + + fonts_src = evas_object_list_prepend(fonts_src, fs); + return fs; +} + +RGBA_Font_Source * +evas_common_font_source_find(const char *name) +{ + Evas_Object_List *l; + + if (!name) return NULL; + for (l = fonts_src; l; l = l->next) + { + RGBA_Font_Source *fs; + + fs = (RGBA_Font_Source *)l; + if ((fs->name) && (!strcmp(name, fs->name))) + { + fs->references++; + fonts_src = evas_object_list_remove(fonts_src, fs); + fonts_src = evas_object_list_prepend(fonts_src, fs); + return fs; + } + } + return NULL; +} + +void +evas_common_font_source_free(RGBA_Font_Source *fs) +{ + fs->references--; + if (fs->references > 0) return; + + fonts_src = evas_object_list_remove(fonts_src, fs); + if (fs->name) free(fs->name); + if (fs->file) free(fs->file); + if (fs->data) free(fs->data); + FT_Done_Face(fs->ft.face); + free(fs); +} + +void +evas_common_font_size_use(RGBA_Font *fn) +{ + if (fn->src->current_size == fn->real_size) return; + FT_Set_Char_Size(fn->src->ft.face, 0, fn->real_size, 96, 96); + fn->src->current_size = fn->real_size; +} + +RGBA_Font * +evas_common_font_memory_load(const char *name, int size, const void *data, int data_size) +{ RGBA_Font *fn; - char *file; fn = evas_common_font_find(name, size); if (fn) return fn; fn = malloc(sizeof(RGBA_Font)); - file = (char *)name; + if (!fn) return NULL; - error = FT_New_Face(evas_ft_lib, file, 0, &(fn->ft.face)); - if (error) + fn->src = evas_common_font_source_find(name); + if (!fn->src) fn->src = evas_common_font_source_memory_load(name, data, data_size); + + if (!fn->src) { free(fn); return NULL; } - error = FT_Set_Char_Size(fn->ft.face, 0, (size * 64), 96, 96); + + fn->size = size; + + return evas_common_font_load_init(fn); +} + +RGBA_Font * +evas_common_font_load(const char *name, int size) +{ + RGBA_Font *fn; + + fn = evas_common_font_find(name, size); + if (fn) return fn; + + fn = malloc(sizeof(RGBA_Font)); + if (!fn) return NULL; + + fn->src = evas_common_font_source_find(name); + if (!fn->src) fn->src = evas_common_font_source_load(name); + + if (!fn->src) + { + free(fn); + return NULL; + } + + fn->size = size; + + return evas_common_font_load_init(fn); +} + +RGBA_Font * +evas_common_font_load_init(RGBA_Font *fn) +{ + int error; + + fn->real_size = fn->size * 64; + error = FT_Set_Char_Size(fn->src->ft.face, 0, (fn->size * 64), 96, 96); if (error) - error = FT_Set_Pixel_Sizes(fn->ft.face, 0, size); + { + error = FT_Set_Pixel_Sizes(fn->src->ft.face, 0, fn->size); + fn->real_size = fn->size; + } if (error) { int i; int chosen_size = 0; int chosen_width = 0; - for (i = 0; i < fn->ft.face->num_fixed_sizes; i++) + for (i = 0; i < fn->src->ft.face->num_fixed_sizes; i++) { int s; int d, cd; - s = fn->ft.face->available_sizes[i].height; - cd = chosen_size - size; + s = fn->src->ft.face->available_sizes[i].height; + cd = chosen_size - fn->size; if (cd < 0) cd = -cd; - d = s - size; + d = s - fn->size; if (d < 0) d = -d; if (d < cd) { - chosen_width = fn->ft.face->available_sizes[i].width; + chosen_width = fn->src->ft.face->available_sizes[i].width; chosen_size = s; } if (d == 0) break; } - error = FT_Set_Pixel_Sizes(fn->ft.face, chosen_width, chosen_size); + error = FT_Set_Pixel_Sizes(fn->src->ft.face, chosen_width, chosen_size); if (error) { /* couldn't choose the size anyway... what now? */ } + fn->real_size = chosen_size; } + fn->src->current_size = fn->real_size; #if 0 /* debugging to look at charmaps in a ttf */ - printf("%i\n", fn->ft.face->num_charmaps); + printf("%i\n", fn->src->ft.face->num_charmaps); { int i; - for (i = 0; i < fn->ft.face->num_charmaps; i++) + for (i = 0; i < fn->src->ft.face->num_charmaps; i++) { printf("%i: %x, %c\n", - i, fn->ft.face->charmaps[i]->encoding, - fn->ft.face->charmaps[i]->encoding); + i, fn->src->ft.face->charmaps[i]->encoding, + fn->src->ft.face->charmaps[i]->encoding); } } #endif - error = FT_Select_Charmap(fn->ft.face, ft_encoding_unicode); + error = FT_Select_Charmap(fn->src->ft.face, ft_encoding_unicode); if (error) { /* disable this for now... - error = FT_Select_Charmap(fn->ft.face, ft_encoding_latin_2); + error = FT_Select_Charmap(fn->src->ft.face, ft_encoding_latin_2); if (error) { - error = FT_Select_Charmap(fn->ft.face, ft_encoding_sjis); + error = FT_Select_Charmap(fn->src->ft.face, ft_encoding_sjis); if (error) { - error = FT_Select_Charmap(fn->ft.face, ft_encoding_gb2312); + error = FT_Select_Charmap(fn->src->ft.face, ft_encoding_gb2312); if (error) { - error = FT_Select_Charmap(fn->ft.face, ft_encoding_big5); + error = FT_Select_Charmap(fn->src->ft.face, ft_encoding_big5); if (error) { } @@ -101,16 +243,9 @@ evas_common_font_load(const char *name, int size) */ } - fn->file = strdup(file); - fn->name = strdup(file); - fn->size = size; - fn->glyphs = NULL; - fn->usage = 0; - fn->references = 1; - fonts = evas_object_list_prepend(fonts, fn); return fn; } @@ -145,13 +280,11 @@ font_modify_cache_cb(Evas_Hash *hash, const char *key, void *data, void *fdata) void evas_common_font_modify_cache_by(RGBA_Font *fn, int dir) { - int sz_name = 0, sz_file = 0, sz_hash = 0; + int sz_hash = 0; - if (fn->name) sz_name = strlen(fn->name); - if (fn->file) sz_file = strlen(fn->file); if (fn->glyphs) sz_hash = sizeof(Evas_Hash); evas_hash_foreach(fn->glyphs, font_modify_cache_cb, &dir); - font_cache_usage += dir * (sizeof(RGBA_Font) + sz_name + sz_file + sz_hash + + font_cache_usage += dir * (sizeof(RGBA_Font) + sz_hash + sizeof(FT_FaceRec) + 16384); /* fudge values */ } @@ -212,9 +345,8 @@ evas_common_font_flush_last(void) evas_hash_foreach(fn->glyphs, font_flush_free_glyph_cb, NULL); evas_hash_free(fn->glyphs); - if (fn->file) free(fn->file); - if (fn->name) free(fn->name); - FT_Done_Face(fn->ft.face); + evas_common_font_source_free(fn->src); + free(fn); } @@ -228,7 +360,7 @@ evas_common_font_find(const char *name, int size) RGBA_Font *fn; fn = (RGBA_Font *)l; - if ((fn->size == size) && (!strcmp(name, fn->name))) + if ((fn->size == size) && (!strcmp(name, fn->src->name))) { if (fn->references == 0) evas_common_font_modify_cache_by(fn, -1); fn->references++; diff --git a/legacy/evas/src/lib/engines/common/evas_font_main.c b/legacy/evas/src/lib/engines/common/evas_font_main.c index dcc8b90784..9442935330 100644 --- a/legacy/evas/src/lib/engines/common/evas_font_main.c +++ b/legacy/evas/src/lib/engines/common/evas_font_main.c @@ -34,9 +34,9 @@ evas_common_font_ascent_get(RGBA_Font *fn) int val; int ret; - val = (int)fn->ft.face->ascender; - fn->ft.face->units_per_EM = 2048; /* nasy hack - need to have correct val */ - ret = (val * fn->ft.face->size->metrics.y_scale) / (fn->ft.face->units_per_EM * fn->ft.face->units_per_EM); + val = (int)fn->src->ft.face->ascender; + fn->src->ft.face->units_per_EM = 2048; /* nasy hack - need to have correct val */ + ret = (val * fn->src->ft.face->size->metrics.y_scale) / (fn->src->ft.face->units_per_EM * fn->src->ft.face->units_per_EM); return ret; } @@ -46,9 +46,10 @@ evas_common_font_descent_get(RGBA_Font *fn) int val; int ret; - val = -(int)fn->ft.face->descender; - fn->ft.face->units_per_EM = 2048; /* nasy hack - need to have correct val */ - ret = (val * fn->ft.face->size->metrics.y_scale) / (fn->ft.face->units_per_EM * fn->ft.face->units_per_EM); + evas_common_font_size_use(fn); + val = -(int)fn->src->ft.face->descender; + fn->src->ft.face->units_per_EM = 2048; /* nasy hack - need to have correct val */ + ret = (val * fn->src->ft.face->size->metrics.y_scale) / (fn->src->ft.face->units_per_EM * fn->src->ft.face->units_per_EM); return ret; } @@ -58,9 +59,10 @@ evas_common_font_max_ascent_get(RGBA_Font *fn) int val; int ret; - val = (int)fn->ft.face->bbox.yMax; - fn->ft.face->units_per_EM = 2048; /* nasy hack - need to have correct val */ - ret = (val * fn->ft.face->size->metrics.y_scale) / (fn->ft.face->units_per_EM * fn->ft.face->units_per_EM); + evas_common_font_size_use(fn); + val = (int)fn->src->ft.face->bbox.yMax; + fn->src->ft.face->units_per_EM = 2048; /* nasy hack - need to have correct val */ + ret = (val * fn->src->ft.face->size->metrics.y_scale) / (fn->src->ft.face->units_per_EM * fn->src->ft.face->units_per_EM); return ret; } @@ -70,9 +72,10 @@ evas_common_font_max_descent_get(RGBA_Font *fn) int val; int ret; - val = -(int)fn->ft.face->bbox.yMin; - fn->ft.face->units_per_EM = 2048; /* nasy hack - need to have correct val */ - ret = (val * fn->ft.face->size->metrics.y_scale) / (fn->ft.face->units_per_EM * fn->ft.face->units_per_EM); + evas_common_font_size_use(fn); + val = -(int)fn->src->ft.face->bbox.yMin; + fn->src->ft.face->units_per_EM = 2048; /* nasy hack - need to have correct val */ + ret = (val * fn->src->ft.face->size->metrics.y_scale) / (fn->src->ft.face->units_per_EM * fn->src->ft.face->units_per_EM); return ret; } @@ -82,9 +85,10 @@ evas_common_font_get_line_advance(RGBA_Font *fn) int val; int ret; - val = (int)fn->ft.face->height; - fn->ft.face->units_per_EM = 2048; /* nasy hack - need to have correct val */ - ret = (val * fn->ft.face->size->metrics.y_scale) / (fn->ft.face->units_per_EM * fn->ft.face->units_per_EM); + evas_common_font_size_use(fn); + val = (int)fn->src->ft.face->height; + fn->src->ft.face->units_per_EM = 2048; /* nasy hack - need to have correct val */ + ret = (val * fn->src->ft.face->size->metrics.y_scale) / (fn->src->ft.face->units_per_EM * fn->src->ft.face->units_per_EM); return ret; } diff --git a/legacy/evas/src/lib/engines/common/evas_font_query.c b/legacy/evas/src/lib/engines/common/evas_font_query.c index bc1b938e80..bf5615da26 100644 --- a/legacy/evas/src/lib/engines/common/evas_font_query.c +++ b/legacy/evas/src/lib/engines/common/evas_font_query.c @@ -14,7 +14,8 @@ evas_common_font_query_size(RGBA_Font *fn, const char *text, int *w, int *h) end_x = 0; pen_x = 0; pen_y = 0; - use_kerning = FT_HAS_KERNING(fn->ft.face); + evas_common_font_size_use(fn); + use_kerning = FT_HAS_KERNING(fn->src->ft.face); prev_index = 0; for (chr = 0; text[chr];) { @@ -25,12 +26,12 @@ evas_common_font_query_size(RGBA_Font *fn, const char *text, int *w, int *h) gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr); if (gl == 0) break; - index = FT_Get_Char_Index(fn->ft.face, gl); + index = FT_Get_Char_Index(fn->src->ft.face, gl); if ((use_kerning) && (prev_index) && (index)) { FT_Vector delta; - FT_Get_Kerning(fn->ft.face, prev_index, index, + FT_Get_Kerning(fn->src->ft.face, prev_index, index, ft_kerning_default, &delta); pen_x += delta.x << 2; } @@ -64,7 +65,8 @@ evas_common_font_query_inset(RGBA_Font *fn, const char *text) if (!text[0]) return 0; gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr); if (gl == 0) return 0; - index = FT_Get_Char_Index(fn->ft.face, gl); + evas_common_font_size_use(fn); + index = FT_Get_Char_Index(fn->src->ft.face, gl); fg = evas_common_font_cache_glyph_get(fn, index); if (!fg) return 0; return fg->glyph_out->left; @@ -83,7 +85,8 @@ evas_common_font_query_advance(RGBA_Font *fn, const char *text, int *h_adv, int start_x = 0; pen_x = 0; pen_y = 0; - use_kerning = FT_HAS_KERNING(fn->ft.face); + evas_common_font_size_use(fn); + use_kerning = FT_HAS_KERNING(fn->src->ft.face); prev_index = 0; for (chr = 0; text[chr];) { @@ -94,12 +97,12 @@ evas_common_font_query_advance(RGBA_Font *fn, const char *text, int *h_adv, int gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr); if (gl == 0) break; - index = FT_Get_Char_Index(fn->ft.face, gl); + index = FT_Get_Char_Index(fn->src->ft.face, gl); if ((use_kerning) && (prev_index) && (index)) { FT_Vector delta; - FT_Get_Kerning(fn->ft.face, prev_index, index, + FT_Get_Kerning(fn->src->ft.face, prev_index, index, ft_kerning_default, &delta); pen_x += delta.x << 2; } @@ -130,7 +133,8 @@ evas_common_font_query_char_coords(RGBA_Font *fn, const char *text, int pos, int pen_x = 0; pen_y = 0; - use_kerning = FT_HAS_KERNING(fn->ft.face); + evas_common_font_size_use(fn); + use_kerning = FT_HAS_KERNING(fn->src->ft.face); prev_index = 0; prev_chr_end = 0; asc = evas_common_font_max_ascent_get(fn); @@ -147,11 +151,11 @@ evas_common_font_query_char_coords(RGBA_Font *fn, const char *text, int pos, int pchr = chr; gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr); if (gl == 0) break; - index = FT_Get_Char_Index(fn->ft.face, gl); + index = FT_Get_Char_Index(fn->src->ft.face, gl); kern = 0; if ((use_kerning) && (prev_index) && (index)) { - FT_Get_Kerning(fn->ft.face, prev_index, index, + FT_Get_Kerning(fn->src->ft.face, prev_index, index, ft_kerning_default, &delta); kern = delta.x << 2; pen_x += kern; @@ -203,7 +207,8 @@ evas_common_font_query_text_at_pos(RGBA_Font *fn, const char *text, int x, int y pen_x = 0; pen_y = 0; - use_kerning = FT_HAS_KERNING(fn->ft.face); + evas_common_font_size_use(fn); + use_kerning = FT_HAS_KERNING(fn->src->ft.face); prev_index = 0; prev_chr_end = 0; asc = evas_common_font_max_ascent_get(fn); @@ -220,11 +225,11 @@ evas_common_font_query_text_at_pos(RGBA_Font *fn, const char *text, int x, int y pchr = chr; gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr); if (gl == 0) break; - index = FT_Get_Char_Index(fn->ft.face, gl); + index = FT_Get_Char_Index(fn->src->ft.face, gl); kern = 0; if ((use_kerning) && (prev_index) && (index)) { - FT_Get_Kerning(fn->ft.face, prev_index, index, + FT_Get_Kerning(fn->src->ft.face, prev_index, index, ft_kerning_default, &delta); kern = delta.x << 2; pen_x += kern; diff --git a/legacy/evas/src/lib/engines/directfb/evas_engine_dfb.c b/legacy/evas/src/lib/engines/directfb/evas_engine_dfb.c index 8ce3a0e6a9..33b71b8b51 100644 --- a/legacy/evas/src/lib/engines/directfb/evas_engine_dfb.c +++ b/legacy/evas/src/lib/engines/directfb/evas_engine_dfb.c @@ -62,6 +62,7 @@ Evas_Func evas_engine_directfb_func = { evas_engine_directfb_image_cache_get, /* more to come */ evas_engine_directfb_font_load, + evas_engine_directfb_font_memory_load, evas_engine_directfb_font_free, evas_engine_directfb_font_ascent_get, evas_engine_directfb_font_descent_get, @@ -759,6 +760,15 @@ evas_engine_directfb_font_load(void *data, char *name, int size) return evas_common_font_load(name, size); } +void * +evas_engine_directfb_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size) +{ + Render_Engine *re; + + re = (Render_Engine *) data; + return evas_common_font_memory_load(name, size, fdata, fdata_size); +} + void evas_engine_directfb_font_free(void *data, void *font) { diff --git a/legacy/evas/src/lib/engines/directfb/evas_engine_dfb.h b/legacy/evas/src/lib/engines/directfb/evas_engine_dfb.h index a29e9e4046..82ccc5e516 100644 --- a/legacy/evas/src/lib/engines/directfb/evas_engine_dfb.h +++ b/legacy/evas/src/lib/engines/directfb/evas_engine_dfb.h @@ -133,6 +133,11 @@ void evas_engine_directfb_gradient_draw(void *data, double angle); void *evas_engine_directfb_font_load(void *data, char *name, int size); +void *evas_engine_directfb_font_memory_load(void *data, + char *name, + int size, + const void *fdata, + int fdata_size); void evas_engine_directfb_font_free(void *data, void *font); int evas_engine_directfb_font_ascent_get(void *data, void *font); diff --git a/legacy/evas/src/lib/engines/fb/evas_engine.c b/legacy/evas/src/lib/engines/fb/evas_engine.c index f45c2ff118..5531871bef 100644 --- a/legacy/evas/src/lib/engines/fb/evas_engine.c +++ b/legacy/evas/src/lib/engines/fb/evas_engine.c @@ -57,6 +57,7 @@ static void evas_engine_fb_image_cache_flush(void *data); static void evas_engine_fb_image_cache_set(void *data, int bytes); static int evas_engine_fb_image_cache_get(void *data); static void *evas_engine_fb_font_load(void *data, char *name, int size); +static void *evas_engine_fb_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size); static void evas_engine_fb_font_free(void *data, void *font); static int evas_engine_fb_font_ascent_get(void *data, void *font); static int evas_engine_fb_font_descent_get(void *data, void *font); @@ -142,6 +143,7 @@ Evas_Func evas_engine_fb_func = evas_engine_fb_image_cache_get, /* font draw functions */ evas_engine_fb_font_load, + evas_engine_fb_font_memory_load, evas_engine_fb_font_free, evas_engine_fb_font_ascent_get, evas_engine_fb_font_descent_get, @@ -844,6 +846,15 @@ evas_engine_fb_font_load(void *data, char *name, int size) return evas_common_font_load(name, size); } +static void * +evas_engine_fb_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + return evas_common_font_memory_load(name, size, fdata, fdata_size); +} + static void evas_engine_fb_font_free(void *data, void *font) { diff --git a/legacy/evas/src/lib/engines/gl_x11/evas_engine.c b/legacy/evas/src/lib/engines/gl_x11/evas_engine.c index 2fe7fd4988..a72578d142 100644 --- a/legacy/evas/src/lib/engines/gl_x11/evas_engine.c +++ b/legacy/evas/src/lib/engines/gl_x11/evas_engine.c @@ -58,6 +58,7 @@ static void evas_engine_gl_x11_image_cache_flush(void *data); static void evas_engine_gl_x11_image_cache_set(void *data, int bytes); static int evas_engine_gl_x11_image_cache_get(void *data); static void *evas_engine_gl_x11_font_load(void *data, char *name, int size); +static void *evas_engine_gl_x11_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size); static void evas_engine_gl_x11_font_free(void *data, void *font); static int evas_engine_gl_x11_font_ascent_get(void *data, void *font); static int evas_engine_gl_x11_font_descent_get(void *data, void *font); @@ -148,6 +149,7 @@ Evas_Func evas_engine_gl_x11_func = evas_engine_gl_x11_image_cache_get, /* font draw functions */ evas_engine_gl_x11_font_load, + evas_engine_gl_x11_font_memory_load, evas_engine_gl_x11_font_free, evas_engine_gl_x11_font_ascent_get, evas_engine_gl_x11_font_descent_get, @@ -851,6 +853,15 @@ evas_engine_gl_x11_font_load(void *data, char *name, int size) return evas_common_font_load(name, size); } +static void * +evas_engine_gl_x11_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + return evas_common_font_memory_load(name, size, fdata, fdata_size); +} + static void evas_engine_gl_x11_font_free(void *data, void *font) { diff --git a/legacy/evas/src/lib/engines/software_qtopia/evas_engine.c b/legacy/evas/src/lib/engines/software_qtopia/evas_engine.c index 1561003473..d1e6c2b759 100644 --- a/legacy/evas/src/lib/engines/software_qtopia/evas_engine.c +++ b/legacy/evas/src/lib/engines/software_qtopia/evas_engine.c @@ -57,6 +57,7 @@ static void evas_engine_software_qtopia_image_cache_flush(void *data); static void evas_engine_software_qtopia_image_cache_set(void *data, int bytes); static int evas_engine_software_qtopia_image_cache_get(void *data); static void *evas_engine_software_qtopia_font_load(void *data, char *name, int size); +static void *evas_engine_software_qtopia_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size); static void evas_engine_software_qtopia_font_free(void *data, void *font); static int evas_engine_software_qtopia_font_ascent_get(void *data, void *font); static int evas_engine_software_qtopia_font_descent_get(void *data, void *font); @@ -145,6 +146,7 @@ Evas_Func evas_engine_software_qtopia_func = evas_engine_software_qtopia_image_cache_get, /* font draw functions */ evas_engine_software_qtopia_font_load, + evas_engine_software_qtopia_font_memory_load, evas_engine_software_qtopia_font_free, evas_engine_software_qtopia_font_ascent_get, evas_engine_software_qtopia_font_descent_get, @@ -867,6 +869,15 @@ evas_engine_software_qtopia_font_load(void *data, char *name, int size) return evas_common_font_load(name, size); } +static void * +evas_engine_software_qtopia_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + return evas_common_font_load(name, size, fdata, fdata_size); +} + static void evas_engine_software_qtopia_font_free(void *data, void *font) { diff --git a/legacy/evas/src/lib/engines/software_x11/evas_engine.c b/legacy/evas/src/lib/engines/software_x11/evas_engine.c index 79f452e153..fa411656c9 100644 --- a/legacy/evas/src/lib/engines/software_x11/evas_engine.c +++ b/legacy/evas/src/lib/engines/software_x11/evas_engine.c @@ -57,6 +57,7 @@ static void evas_engine_software_x11_image_cache_flush(void *data); static void evas_engine_software_x11_image_cache_set(void *data, int bytes); static int evas_engine_software_x11_image_cache_get(void *data); static void *evas_engine_software_x11_font_load(void *data, char *name, int size); +static void *evas_engine_software_x11_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size); static void evas_engine_software_x11_font_free(void *data, void *font); static int evas_engine_software_x11_font_ascent_get(void *data, void *font); static int evas_engine_software_x11_font_descent_get(void *data, void *font); @@ -157,6 +158,7 @@ Evas_Func evas_engine_software_x11_func = evas_engine_software_x11_image_cache_get, /* font draw functions */ evas_engine_software_x11_font_load, + evas_engine_software_x11_font_memory_load, evas_engine_software_x11_font_free, evas_engine_software_x11_font_ascent_get, evas_engine_software_x11_font_descent_get, @@ -911,6 +913,15 @@ evas_engine_software_x11_font_load(void *data, char *name, int size) return evas_common_font_load(name, size); } +static void * +evas_engine_software_x11_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size) +{ + Render_Engine *re; + + re = (Render_Engine *)data; + return evas_common_font_memory_load(name, size, fdata, fdata_size); +} + static void evas_engine_software_x11_font_free(void *data, void *font) { diff --git a/legacy/evas/src/lib/include/evas_common.h b/legacy/evas/src/lib/include/evas_common.h index ceea0228c8..7b29f624f3 100644 --- a/legacy/evas/src/lib/include/evas_common.h +++ b/legacy/evas/src/lib/include/evas_common.h @@ -165,6 +165,7 @@ typedef struct _RGBA_Gradient RGBA_Gradient; typedef struct _RGBA_Gradient_Color RGBA_Gradient_Color; typedef struct _RGBA_Polygon_Point RGBA_Polygon_Point; typedef struct _RGBA_Font RGBA_Font; +typedef struct _RGBA_Font_Source RGBA_Font_Source; typedef struct _RGBA_Font_Glyph RGBA_Font_Glyph; typedef struct _Cutout_Rect Cutout_Rect; @@ -332,13 +333,11 @@ struct _RGBA_Polygon_Point struct _RGBA_Font { Evas_Object_List _list_data; - char *name; - char *file; - int size; - struct { - FT_Face face; - } ft; + RGBA_Font_Source *src; + + int size; + int real_size; Evas_Hash *glyphs; @@ -347,6 +346,25 @@ struct _RGBA_Font int references; }; +struct _RGBA_Font_Source +{ + Evas_Object_List _list_data; + + char *name; + char *file; + + void *data; + int data_size; + + int current_size; + + struct { + FT_Face face; + } ft; + + int references; +}; + struct _RGBA_Font_Glyph { FT_Glyph glyph; @@ -805,8 +823,14 @@ void evas_common_blit_rectangle (RGBA_Image *src, RGBA_Image * /****/ void evas_common_font_init (void); void evas_common_font_shutdown (void); - +RGBA_Font_Source *evas_common_font_source_memory_load(const char *name, const void *data, int data_size); +RGBA_Font_Source *evas_common_font_source_load (const char *name); +RGBA_Font_Source *evas_common_font_source_find (const char *name); +void evas_common_font_source_free (RGBA_Font_Source *fs); +void evas_common_font_size_use (RGBA_Font *fn); +RGBA_Font *evas_common_font_memory_load (const char *name, int size, const void *data, int data_size); RGBA_Font *evas_common_font_load (const char *name, int size); +RGBA_Font *evas_common_font_load_init (RGBA_Font *fn); void evas_common_font_free (RGBA_Font *fn); void evas_common_font_modify_cache_by (RGBA_Font *fn, int dir); int evas_common_font_cache_get (void); diff --git a/legacy/evas/src/lib/include/evas_private.h b/legacy/evas/src/lib/include/evas_private.h index 966bff0783..234d9d63e0 100644 --- a/legacy/evas/src/lib/include/evas_private.h +++ b/legacy/evas/src/lib/include/evas_private.h @@ -524,6 +524,7 @@ struct _Evas_Func int (*image_cache_get) (void *data); void *(*font_load) (void *data, char *name, int size); + void *(*font_memory_load) (void *data, char *name, int size, const void *fdata, int fdata_size); void (*font_free) (void *data, void *font); int (*font_ascent_get) (void *data, void *font); int (*font_descent_get) (void *data, void *font);