From 187f9e61bd1bfe5ba76090e0406500f00d664402 Mon Sep 17 00:00:00 2001 From: raster Date: Mon, 30 Aug 2010 03:21:15 +0000 Subject: [PATCH] aaah... so.. if we have a fribidi lock.. shall we.. hmrrrm maybe use it? and... lets not just throw pointer onto pipelines just for the hell of it.. as like.. hmm the object owning the pointer might be freed before pipelien finishes.. or hell. it might change pointer contents? :) need to nwo dup bidi intl_props. probably a better plan.. tasn looking at you... is to fix up evas bidi utils and make the intl props a new/free thing (and sharable eh?) with reference counts to avoid dups (just ref up most of the time - and if u change, make a new intl prop - dont change current one) etc. etc. for now dup - this gives a perf hit tho. at least async rendering works now. git-svn-id: http://svn.enlightenment.org/svn/e/trunk/evas@51736 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/lib/engines/common/evas_bidi_utils.c | 57 ++++++++++++++++++++++++++++++++ src/lib/engines/common/evas_bidi_utils.h | 3 ++ src/lib/engines/common/evas_font_draw.c | 29 ++++++++-------- src/lib/engines/common/evas_font_query.c | 42 +++++++++++++++++------ src/lib/engines/common/evas_pipe.c | 11 ++++-- src/lib/include/evas_common.h | 2 +- 6 files changed, 115 insertions(+), 29 deletions(-) diff --git a/src/lib/engines/common/evas_bidi_utils.c b/src/lib/engines/common/evas_bidi_utils.c index a64955b..cc54f05 100644 --- a/src/lib/engines/common/evas_bidi_utils.c +++ b/src/lib/engines/common/evas_bidi_utils.c @@ -224,6 +224,8 @@ evas_bidi_update_props(const Eina_Unicode *eina_ustr, Evas_BiDi_Paragraph_Props free(bidi_props->char_types); } bidi_props->char_types = char_types; + + bidi_props->len = len; if (base_ustr) free(base_ustr); @@ -239,6 +241,61 @@ cleanup: return len; } +int +evas_bidi_update_props_dup(const Evas_BiDi_Props *src, Evas_BiDi_Props *dst) +{ + dst->start = src->start; + dst->props = NULL; + if (!src->props) return 1; + dst->props = malloc(sizeof(Evas_BiDi_Paragraph_Props)); + if (!dst->props) return 0; + if (src->props->len > 0) + { + if (src->props->char_types) + { + dst->props->char_types = + malloc(sizeof(EvasBiDiCharType) * src->props->len); + if (!dst->props->char_types) + { + free(dst->props); + dst->props = NULL; + dst->start = 0; + return 0; + } + memcpy(dst->props->char_types, src->props->char_types, + sizeof(EvasBiDiCharType) * src->props->len); + } + else + dst->props->char_types = NULL; + if (src->props->embedding_levels) + { + dst->props->embedding_levels = + malloc(sizeof(EvasBiDiLevel) * src->props->len); + if (!dst->props->embedding_levels) + { + if (dst->props->char_types) free(dst->props->char_types); + free(dst->props); + dst->props = NULL; + dst->start = 0; + return 0; + } + memcpy(dst->props->embedding_levels, src->props->embedding_levels, + sizeof(EvasBiDiLevel) * src->props->len); + } + else + dst->props->embedding_levels = NULL; + } + else + { + dst->props->char_types = NULL; + dst->props->embedding_levels = NULL; + dst->props->len = 0; + } + dst->props->len = src->props->len; + dst->props->direction = src->props->direction; + return 1; +} + /** * @internal * Reorders ustr according to the bidi props. diff --git a/src/lib/engines/common/evas_bidi_utils.h b/src/lib/engines/common/evas_bidi_utils.h index 0d51675..0ca29d3 100644 --- a/src/lib/engines/common/evas_bidi_utils.h +++ b/src/lib/engines/common/evas_bidi_utils.h @@ -67,6 +67,7 @@ typedef struct _Evas_BiDi_Props Evas_BiDi_Props; struct _Evas_BiDi_Paragraph_Props { EvasBiDiCharType *char_types; /* BiDi char types */ EvasBiDiLevel *embedding_levels; /* BiDi embedding levels */ + int len; /* length of char_types & embedding_levels */ #ifdef USE_FRIBIDI EvasBiDiParType direction; #endif @@ -112,6 +113,8 @@ evas_bidi_props_reorder_line(Eina_Unicode *text, const Evas_BiDi_Props *intl_pro int evas_bidi_update_props(const Eina_Unicode *text, Evas_BiDi_Paragraph_Props *intl_props) EINA_ARG_NONNULL(1, 2); +int +evas_bidi_update_props_dup(const Evas_BiDi_Props *src, Evas_BiDi_Props *dst); Eina_Bool evas_bidi_shape_string(Eina_Unicode *ustr, const Evas_BiDi_Props *intl_props, size_t len); diff --git a/src/lib/engines/common/evas_font_draw.c b/src/lib/engines/common/evas_font_draw.c index 469c3ac..bdec478 100644 --- a/src/lib/engines/common/evas_font_draw.c +++ b/src/lib/engines/common/evas_font_draw.c @@ -50,10 +50,6 @@ evas_common_font_draw_init(void) { char *p; int tmp; -#ifdef EVAS_FRAME_QUEUING - LKI(lock_font_draw); - LKI(lock_fribidi); -#endif if ((p = getenv("EVAS_WORD_CACHE_MAX_WORDS"))) { tmp = strtol(p,NULL,10); @@ -67,9 +63,7 @@ evas_common_font_draw_init(void) #ifdef EVAS_FRAME_QUEUING EAPI void evas_common_font_draw_finish(void) -{ - LKD(lock_font_draw); - LKD(lock_fribidi); +{ } #endif @@ -488,6 +482,7 @@ evas_common_font_draw_internal(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font #endif #ifdef BIDI_SUPPORT + LKL(lock_fribidi); Eina_Unicode *visual_text; visual_text = eina_unicode_strdup(in_text); @@ -501,6 +496,7 @@ evas_common_font_draw_internal(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font { text = in_text; } + LKU(lock_fribidi); #endif @@ -743,7 +739,7 @@ evas_common_font_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn, int if (ext_w <= 0) return; if (ext_h <= 0) return; -#ifndef EVAS_FRAME_QUEUING +#ifdef EVAS_FRAME_QUEUING LKL(fn->lock); #endif // evas_common_font_size_use(fn); @@ -778,7 +774,7 @@ evas_common_font_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn, int } dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch; } -#ifndef EVAS_FRAME_QUEUING +#ifdef EVAS_FRAME_QUEUING LKU(fn->lock); #endif } @@ -851,6 +847,7 @@ evas_font_word_prerender(RGBA_Draw_Context *dc, const Eina_Unicode *in_text, Eva { int kern = 0; # ifdef BIDI_SUPPORT + LKL(lock_fribidi); /* if it's rtl, the kerning matching should be reversed, i.e prev * index is now the index and the other way around. * There is a slight exception when there are compositing chars @@ -863,14 +860,18 @@ evas_font_word_prerender(RGBA_Draw_Context *dc, const Eina_Unicode *in_text, Eva pen_x += kern; } else -# endif - { - + { if (evas_common_font_query_kerning(fi, prev_index, ci->index, &kern)) pen_x += kern; - } + } + LKU(lock_fribidi); +# else + + if (evas_common_font_query_kerning(fi, prev_index, ci->index, &kern)) + pen_x += kern; +# endif } - + pface = fi->src->ft.face; LKU(fi->ft_mutex); diff --git a/src/lib/engines/common/evas_font_query.c b/src/lib/engines/common/evas_font_query.c index 4c4ecf3..5788034 100644 --- a/src/lib/engines/common/evas_font_query.c +++ b/src/lib/engines/common/evas_font_query.c @@ -111,24 +111,28 @@ evas_common_font_query_size(RGBA_Font *fn, const Eina_Unicode *text, const Evas_ (pface == fi->src->ft.face)) { #ifdef BIDI_SUPPORT + LKL(lock_fribidi); /* if it's rtl, the kerning matching should be reversed, i.e prev * index is now the index and the other way around. * There is a slight exception when there are compositing chars * involved.*/ if (intl_props && - evas_bidi_is_rtl_char(intl_props->props->embedding_levels, char_index) && - fg->glyph->advance.x >> 16 > 0) + evas_bidi_is_rtl_char(intl_props->props->embedding_levels, char_index) && + fg->glyph->advance.x >> 16 > 0) { if (evas_common_font_query_kerning(fi, index, prev_index, &kern)) - pen_x += kern; + pen_x += kern; } else -#endif { - if (evas_common_font_query_kerning(fi, prev_index, index, &kern)) - pen_x += kern; + pen_x += kern; } + LKU(lock_fribidi); +#else + if (evas_common_font_query_kerning(fi, prev_index, index, &kern)) + pen_x += kern; +#endif } pface = fi->src->ft.face; @@ -273,6 +277,7 @@ evas_common_font_query_advance(RGBA_Font *fn, const Eina_Unicode *text, const Ev (pface == fi->src->ft.face)) { #ifdef BIDI_SUPPORT + LKL(lock_fribidi); /* if it's rtl, the kerning matching should be reversed, i.e prev * index is now the index and the other way around. * There is a slight exception when there are compositing chars @@ -285,12 +290,15 @@ evas_common_font_query_advance(RGBA_Font *fn, const Eina_Unicode *text, const Ev pen_x += kern; } else -#endif { - if (evas_common_font_query_kerning(fi, prev_index, index, &kern)) pen_x += kern; } + LKU(lock_fribidi); +#else + if (evas_common_font_query_kerning(fi, prev_index, index, &kern)) + pen_x += kern; +#endif } pface = fi->src->ft.face; @@ -333,8 +341,8 @@ evas_common_font_query_char_coords(RGBA_Font *fn, const Eina_Unicode *in_text, c EvasBiDiStrIndex *visual_to_logical = NULL; Eina_Unicode *visual_text; + LKL(lock_fribidi); visual_text = eina_unicode_strdup(in_text); - if (visual_text) { evas_bidi_props_reorder_line(visual_text, intl_props, &visual_to_logical); @@ -345,6 +353,7 @@ evas_common_font_query_char_coords(RGBA_Font *fn, const Eina_Unicode *in_text, c text = in_text; } len = eina_unicode_strlen(text); + LKU(lock_fribidi); #endif fi = fn->fonts->data; @@ -366,8 +375,10 @@ evas_common_font_query_char_coords(RGBA_Font *fn, const Eina_Unicode *in_text, c desc = evas_common_font_max_descent_get(fn); #ifdef BIDI_SUPPORT + LKL(lock_fribidi); /* Get the position in the visual string because those are the coords we care about */ position = evas_bidi_position_logical_to_visual(visual_to_logical, len, pos); + LKU(lock_fribidi); #else position = pos; #endif @@ -479,6 +490,7 @@ evas_common_font_query_char_at_coords(RGBA_Font *fn, const Eina_Unicode *in_text EvasBiDiStrIndex *visual_to_logical = NULL; Eina_Unicode *visual_text; + LKL(lock_fribidi); visual_text = eina_unicode_strdup(in_text); if (visual_text) @@ -491,6 +503,7 @@ evas_common_font_query_char_at_coords(RGBA_Font *fn, const Eina_Unicode *in_text text = in_text; } len = eina_unicode_strlen(text); + LKU(lock_fribidi); #endif fi = fn->fonts->data; @@ -580,10 +593,12 @@ evas_common_font_query_char_at_coords(RGBA_Font *fn, const Eina_Unicode *in_text if (cw) *cw = chr_w; if (ch) *ch = asc + desc; #ifdef BIDI_SUPPORT + LKL(lock_fribidi); /* we found the char position of the wanted char in the * visual string, we now need to translate it to the * position in the logical string */ position = evas_bidi_position_visual_to_logical(visual_to_logical, position); + LKU(lock_fribidi); #endif ret_val = position; goto end; @@ -659,6 +674,7 @@ evas_common_font_query_last_up_to_pos(RGBA_Font *fn, const Eina_Unicode *in_text (pface == fi->src->ft.face)) { #ifdef BIDI_SUPPORT + LKL(lock_fribidi); /* if it's rtl, the kerning matching should be reversed, i.e prev * index is now the index and the other way around. * There is a slight exception when there are compositing chars @@ -672,13 +688,17 @@ evas_common_font_query_last_up_to_pos(RGBA_Font *fn, const Eina_Unicode *in_text pen_x += kern; } else -#endif { - if (evas_common_font_query_kerning(fi, prev_index, index, &kern)) pen_x += kern; } + LKU(lock_fribidi); +#else + if (evas_common_font_query_kerning(fi, prev_index, index, + &kern)) + pen_x += kern; +#endif } pface = fi->src->ft.face; fg = evas_common_font_int_cache_glyph_get(fi, index); diff --git a/src/lib/engines/common/evas_pipe.c b/src/lib/engines/common/evas_pipe.c index d0d0f81..61dfb1b 100644 --- a/src/lib/engines/common/evas_pipe.c +++ b/src/lib/engines/common/evas_pipe.c @@ -1185,6 +1185,9 @@ evas_common_pipe_op_text_free(RGBA_Pipe_Op *op) #else evas_common_font_free(op->op.text.font); #endif +#ifdef BIDI_SUPPORT + evas_bidi_props_clean(&(op->op.text.intl_props)); +#endif free(op->op.text.text); evas_common_pipe_op_free(op); } @@ -1223,13 +1226,13 @@ evas_common_pipe_text_draw_do(RGBA_Image *dst, RGBA_Pipe_Op *op, RGBA_Pipe_Threa #endif evas_common_font_draw(dst, &(context), op->op.text.font, op->op.text.x, op->op.text.y, - op->op.text.text, op->op.text.intl_props); + op->op.text.text, &op->op.text.intl_props); } else { evas_common_font_draw(dst, &(op->context), op->op.text.font, op->op.text.x, op->op.text.y, - op->op.text.text, op->op.text.intl_props); + op->op.text.text, &op->op.text.intl_props); } } @@ -1245,7 +1248,9 @@ evas_common_pipe_text_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, op->op.text.x = x; op->op.text.y = y; op->op.text.text = eina_unicode_strdup(text); - op->op.text.intl_props = intl_props; +#ifdef BIDI_SUPPORT + evas_bidi_update_props_dup(intl_props, &(op->op.text.intl_props)); +#endif #ifdef EVAS_FRAME_QUEUING LKL(fn->ref_fq_add); fn->ref_fq[0]++; diff --git a/src/lib/include/evas_common.h b/src/lib/include/evas_common.h index a210e71..b86498a 100644 --- a/src/lib/include/evas_common.h +++ b/src/lib/include/evas_common.h @@ -675,7 +675,7 @@ struct _RGBA_Pipe_Op RGBA_Font *font; int x, y; Eina_Unicode *text; - const Evas_BiDi_Props *intl_props; + Evas_BiDi_Props intl_props; } text; struct { RGBA_Image *src; -- 2.7.4