From 10ab9176c6baec36b09bd6811202ee42fc81ccad Mon Sep 17 00:00:00 2001 From: raster Date: Tue, 26 Apr 2011 14:05:01 +0000 Subject: [PATCH] BAD TASN! ROLL BACK TODAYS CHANGES TO EVAS.... SEGV SEGV EVERYWHERE! *SPANK* git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@58933 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/lib/engines/common/evas_font_draw.c | 39 ++++++++++++++++++++++++-------- src/lib/engines/common/evas_text_utils.c | 28 ++++++++++------------- src/lib/engines/common/evas_text_utils.h | 1 - 3 files changed, 41 insertions(+), 27 deletions(-) diff --git a/src/lib/engines/common/evas_font_draw.c b/src/lib/engines/common/evas_font_draw.c index 5ec77f6..5ea57ec 100644 --- a/src/lib/engines/common/evas_font_draw.c +++ b/src/lib/engines/common/evas_font_draw.c @@ -420,12 +420,6 @@ evas_common_font_draw_internal(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font in_text; #else const Eina_Unicode *text = in_text; - /* Not relevant in the Harfbuzz case, and will soon will not be relevant - * at all */ - (void) text; - /* Should be marked as unused? or should I do something fancy about it to - * make sure the given fi is relevant? */ - (void) fn; #endif DATA32 *im; FT_Face pface = NULL; @@ -521,8 +515,21 @@ evas_common_font_draw_internal(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font #endif im = dst->image.data; - fi = text_props->font_instance; - evas_common_font_int_reload(fi); + /* Load the glyph according to the first letter of the script, preety + * bad, but will have to do */ + { + /* Skip common chars */ + const Eina_Unicode *tmp; + for (tmp = text ; + ((size_t) (tmp - text) < text_props->text_len) && + evas_common_language_char_script_get(*tmp) == + EVAS_SCRIPT_COMMON ; + tmp++) + ; + if (((size_t) (tmp - text) == text_props->text_len) && (tmp > text)) + tmp--; + evas_common_font_glyph_search(fn, &fi, *tmp); + } if (fi->src->current_size != fi->size) { @@ -836,8 +843,20 @@ evas_font_word_prerender(RGBA_Draw_Context *dc, const Eina_Unicode *in_text, con gl = dc->font_ext.func.gl_new ? 1: 0; above = 0; below = 0; baseline = 0; height = 0; descent = 0; - fi = text_props->font_instance; - evas_common_font_int_reload(fi); + /* Load the glyph according to the first letter of the script, preety + * bad, but will have to do */ + { + /* Skip common chars */ + const Eina_Unicode *tmp; + for (tmp = text ; + ((tmp - text) < len) && + evas_common_language_char_script_get(*tmp) == + EVAS_SCRIPT_COMMON ; + tmp++) + ; + if (((tmp - text) == len) && (tmp > text)) tmp--; + evas_common_font_glyph_search(fn, &fi, *tmp); + } if (fi->src->current_size != fi->size) { diff --git a/src/lib/engines/common/evas_text_utils.c b/src/lib/engines/common/evas_text_utils.c index edcfb87..64cee18 100644 --- a/src/lib/engines/common/evas_text_utils.c +++ b/src/lib/engines/common/evas_text_utils.c @@ -201,12 +201,18 @@ evas_common_text_props_content_create(void *_fn, const Eina_Unicode *text, } #ifdef OT_SUPPORT - /* FIXME: as soon as we start caching fi for non-harfbuzz as well, move - * this (until text_props->fi = fi outside the ifdef */ + size_t char_index; + Evas_Font_Glyph_Info *gl_itr; + const Eina_Unicode *base_char; + Evas_Coord pen_x = 0, adjust_x = 0; + (void) par_props; + (void) par_pos; + + evas_common_font_ot_populate_text_props(fn, text, text_props, len); + /* Load the glyph according to the first letter of the script, preety * bad, but will have to do */ { - const Eina_Unicode *base_char; /* Skip common chars */ for (base_char = text ; *base_char && @@ -218,17 +224,6 @@ evas_common_text_props_content_create(void *_fn, const Eina_Unicode *text, evas_common_font_glyph_search(fn, &fi, *base_char); } - text_props->font_instance = fi; - - - size_t char_index; - Evas_Font_Glyph_Info *gl_itr; - Evas_Coord pen_x = 0, adjust_x = 0; - (void) par_props; - (void) par_pos; - - evas_common_font_ot_populate_text_props(fn, text, text_props, len); - gl_itr = text_props->info->glyph; for (char_index = 0 ; char_index < text_props->len ; char_index++) { @@ -238,7 +233,6 @@ evas_common_text_props_content_create(void *_fn, const Eina_Unicode *text, /* If we got a malformed index, show the replacement char instead */ if (gl_itr->index == 0) { - /* FIXME: search inside the same fi. */ gl_itr->index = evas_common_font_glyph_search(fn, &fi, REPLACEMENT_CHAR); is_replacement = EINA_TRUE; @@ -279,12 +273,14 @@ evas_common_text_props_content_create(void *_fn, const Eina_Unicode *text, /* Update the advance accordingly */ adjust_x += (pen_x + (fg->glyph->advance.x >> 16)) - gl_itr->pen_after; + + /* FIXME: reload fi, a bit slow, but I have no choice. */ + evas_common_font_glyph_search(fn, &fi, *base_char); } pen_x = gl_itr->pen_after; } gl_itr->pen_after += adjust_x; - fi = text_props->font_instance; gl_itr++; } #else diff --git a/src/lib/engines/common/evas_text_utils.h b/src/lib/engines/common/evas_text_utils.h index d69cfd0..687827a 100644 --- a/src/lib/engines/common/evas_text_utils.h +++ b/src/lib/engines/common/evas_text_utils.h @@ -23,7 +23,6 @@ struct _Evas_Text_Props Evas_BiDi_Props bidi; Evas_Script_Type script; Evas_Text_Props_Info *info; - void *font_instance; /* FIXME: just a hack in the meanwhile, remove when I can finally cache * fi and split to scripts without harfbuzz */ -- 2.7.4