From: tasn Date: Wed, 20 Apr 2011 14:20:57 +0000 (+0000) Subject: Evas font: Removed LOGICAL_WALK and updated last_up_to_pos accondingly. X-Git-Tag: 2.0_alpha~240^2~777 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=db1282f823f8f64e54b12b622ea1677e6dbb480c;p=framework%2Fuifw%2Fevas.git Evas font: Removed LOGICAL_WALK and updated last_up_to_pos accondingly. git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@58758 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- diff --git a/src/lib/engines/common/evas_font_default_walk.x b/src/lib/engines/common/evas_font_default_walk.x index a1f60f2..7e0dcea 100644 --- a/src/lib/engines/common/evas_font_default_walk.x +++ b/src/lib/engines/common/evas_font_default_walk.x @@ -15,25 +15,25 @@ int _pen_x = 0, _pen_y = 0; \ Evas_Coord _start_pen = (text_props->info && \ (text_props->start > 0)) ? \ - text_props->info->glyph[text_props -> start - 1].pen_after : 0 ; \ + text_props->info->glyph[text_props->start - 1].pen_after : 0 ; \ size_t char_index; \ (void) _pen_y; /* Sometimes it won't be used */ /* Visual walk helper macros */ #ifdef OT_SUPPORT -#define _EVAS_FONT_WALK_TEXT_VISUAL_START() \ +#define _EVAS_FONT_WALK_TEXT_START() \ Evas_Font_OT_Info *_ot_itr = (text_props->info) ? \ text_props->info->ot + text_props->start : NULL; \ for (char_index = 0 ; char_index < text_props->len ; char_index++, _glyph_itr++, _ot_itr++) \ { #else -#define _EVAS_FONT_WALK_TEXT_VISUAL_START() \ +#define _EVAS_FONT_WALK_TEXT_START() \ for (char_index = 0 ; char_index < text_props->len ; char_index++, _glyph_itr++) \ { #endif /** - * @def EVAS_FONT_WALK_TEXT_VISUAL_START + * @def EVAS_FONT_WALK_TEXT_START * @internal * This runs through the text in visual order while updating char_index, * which is the current index in the text. @@ -42,68 +42,13 @@ * @see EVAS_FONT_WALK_TEXT_INIT * @see EVAS_FONT_WALK_TEXT_WORK * @see EVAS_FONT_WALK_TEXT_END - * @see EVAS_FONT_WALK_TEXT_LOGICAL_START */ -#define EVAS_FONT_WALK_TEXT_VISUAL_START() \ +#define EVAS_FONT_WALK_TEXT_START() \ do \ { \ Evas_Font_Glyph_Info *_glyph_itr = (text_props->info) ? \ text_props->info->glyph + text_props->start : NULL; \ - _EVAS_FONT_WALK_TEXT_VISUAL_START() - -/* Logical walk helper macros */ -#ifdef OT_SUPPORT -#define _EVAS_FONT_WALK_TEXT_LOGICAL_START() \ - Evas_Font_OT_Info *_ot_itr = (text_props->info) ? \ - text_props->info->ot + text_props->start : NULL; \ - if (text_props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) \ - _ot_itr += text_props->len - 1; \ - for ( ; _i > 0 ; char_index += _char_index_d, _i--, _glyph_itr += _char_index_d, _ot_itr += _char_index_d) \ - { -#else -#define _EVAS_FONT_WALK_TEXT_LOGICAL_START() \ - for ( ; _i > 0 ; char_index += _char_index_d, _i--, _glyph_itr += _char_index_d) \ - { -#endif - -/** - * @def EVAS_FONT_WALK_TEXT_LOGICAL_START - * @internal - * This runs through the text in logical order while updating char_index, - * which is the current index in the text. - * Does not end with a ; - * Take a look at EVAS_FONT_WALK_X_OFF and the like. - * @see EVAS_FONT_WALK_TEXT_INIT - * @see EVAS_FONT_WALK_TEXT_WORK - * @see EVAS_FONT_WALK_TEXT_END - * @see EVAS_FONT_WALK_TEXT_VISUAL_START - */ -#ifdef BIDI_SUPPORT -#define EVAS_FONT_WALK_TEXT_LOGICAL_START() \ - do \ - { \ - Evas_Font_Glyph_Info *_glyph_itr = (text_props->info) ? \ - text_props->info->glyph + text_props->start : \ - NULL; \ - int _char_index_d; \ - size_t _i; \ - _i = text_props->len; \ - if (text_props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) \ - { \ - char_index = text_props->len - 1; \ - _char_index_d = -1; \ - _glyph_itr += text_props->len - 1; \ - } \ - else \ - { \ - char_index = 0; \ - _char_index_d = 1; \ - } \ - _EVAS_FONT_WALK_TEXT_LOGICAL_START() - -#else -#define EVAS_FONT_WALK_TEXT_LOGICAL_START() EVAS_FONT_WALK_TEXT_VISUAL_START() -#endif + _EVAS_FONT_WALK_TEXT_START() #define EVAS_FONT_WALK_ORIG_LEN (_len) @@ -171,9 +116,9 @@ /** * @def EVAS_FONT_WALK_TEXT_WORK * @internal - * This macro actually updates the values mentioned in EVAS_FONT_WALK_TEXT_VISUAL_START + * This macro actually updates the values mentioned in EVAS_FONT_WALK_TEXT_START * according to the current positing in the walk. - * @see EVAS_FONT_WALK_TEXT_VISUAL_START + * @see EVAS_FONT_WALK_TEXT_START * @see EVAS_FONT_WALK_TEXT_INIT * @see EVAS_FONT_WALK_TEXT_END */ @@ -182,8 +127,8 @@ /** * @def EVAS_FONT_WALK_TEXT_END * @internal - * Closes EVAS_FONT_WALK_TEXT_VISUAL_START, needs to end with a ; - * @see EVAS_FONT_WALK_TEXT_VISUAL_START + * Closes EVAS_FONT_WALK_TEXT_START, needs to end with a ; + * @see EVAS_FONT_WALK_TEXT_START * @see EVAS_FONT_WALK_TEXT_INIT * @see EVAS_FONT_WALK_TEXT_WORK */ @@ -196,5 +141,4 @@ } \ while(0) - #endif diff --git a/src/lib/engines/common/evas_font_draw.c b/src/lib/engines/common/evas_font_draw.c index bcd8b64..5d1efb6 100644 --- a/src/lib/engines/common/evas_font_draw.c +++ b/src/lib/engines/common/evas_font_draw.c @@ -539,7 +539,7 @@ evas_common_font_draw_internal(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font fi->src->current_size = fi->size; } - EVAS_FONT_WALK_TEXT_VISUAL_START() + EVAS_FONT_WALK_TEXT_START() { FT_UInt index; RGBA_Font_Glyph *fg; @@ -868,7 +868,7 @@ evas_font_word_prerender(RGBA_Draw_Context *dc, const Eina_Unicode *in_text, con len = text_props->len; metrics = malloc(sizeof(struct cinfo) * len); ci = metrics; - EVAS_FONT_WALK_TEXT_VISUAL_START() + EVAS_FONT_WALK_TEXT_START() { FT_UInt index; RGBA_Font_Glyph *fg; diff --git a/src/lib/engines/common/evas_font_query.c b/src/lib/engines/common/evas_font_query.c index 4a32062..bc9d555 100644 --- a/src/lib/engines/common/evas_font_query.c +++ b/src/lib/engines/common/evas_font_query.c @@ -196,7 +196,7 @@ evas_common_font_query_char_coords(RGBA_Font *fn, const Evas_Text_Props *text_pr int prev_cluster = -1; int found = 0, items = 1, item_pos = 1; int last_is_visible = 0; - EVAS_FONT_WALK_TEXT_VISUAL_START() + EVAS_FONT_WALK_TEXT_START() { EVAS_FONT_WALK_TEXT_WORK(); @@ -319,7 +319,7 @@ evas_common_font_query_pen_coords(RGBA_Font *fn, const Evas_Text_Props *text_pro int prev_cluster = -1; int found = 0, items = 1, item_pos = 1; int last_is_visible = 0; - EVAS_FONT_WALK_TEXT_VISUAL_START() + EVAS_FONT_WALK_TEXT_START() { EVAS_FONT_WALK_TEXT_WORK(); @@ -410,7 +410,7 @@ evas_common_font_query_char_at_coords(RGBA_Font *fn, const Evas_Text_Props *text Evas_Coord cluster_start = 0; int prev_cluster = -1; int found = 0, items = 1; - EVAS_FONT_WALK_TEXT_VISUAL_START() + EVAS_FONT_WALK_TEXT_START() { EVAS_FONT_WALK_TEXT_WORK(); if (prev_cluster != (int) EVAS_FONT_WALK_POS) @@ -486,24 +486,70 @@ evas_common_font_query_last_up_to_pos(RGBA_Font *fn, const Evas_Text_Props *text { int asc, desc; int ret=-1; - EVAS_FONT_WALK_TEXT_INIT(); asc = evas_common_font_max_ascent_get(fn); desc = evas_common_font_max_descent_get(fn); - EVAS_FONT_WALK_TEXT_LOGICAL_START() +#ifdef BIDI_SUPPORT + if (text_props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) { - EVAS_FONT_WALK_TEXT_WORK(); - if (!EVAS_FONT_WALK_IS_VISIBLE) continue; + Evas_Font_Glyph_Info *gli = (text_props->info) ? + text_props->info->glyph + text_props->start : NULL; + Evas_Coord full_adv = 0, pen_x = 0, start_pen = 0; + int i; - if ((x >= EVAS_FONT_WALK_PEN_X) && - (x <= (EVAS_FONT_WALK_PEN_X_AFTER)) && (y >= -asc) && (y <= desc)) + if (text_props->len > 0) { - ret = EVAS_FONT_WALK_POS; - goto end; + full_adv = gli[text_props->len - 1].pen_after; + if (text_props->start > 0) + { + start_pen = gli[-1].pen_after; + full_adv -= start_pen; + } + } + + gli += text_props->len - 1; + for (i = text_props->len - 1 ; i >= 0 ; i--, gli--) + { + pen_x = full_adv - (gli->pen_after - start_pen); + /* If inivisible, skip */ + if (gli->index == 0) continue; + if ((x >= pen_x) && + (((i == 0) && (x <= full_adv)) || + (x <= (full_adv - (gli[-1].pen_after - start_pen)))) && + (y >= -asc) && (y <= desc)) + { +#ifdef OT_SUPPORT + ret = EVAS_FONT_OT_POS_GET( + text_props->info->ot[text_props->start + i]) - + text_props->text_offset; +#else + ret = text_props->text_len - i - 1; +#endif + goto end; + } } } - EVAS_FONT_WALK_TEXT_END(); + else +#endif + { + EVAS_FONT_WALK_TEXT_INIT(); + /* When text is not rtl, visual direction = logical direction */ + EVAS_FONT_WALK_TEXT_START() + { + EVAS_FONT_WALK_TEXT_WORK(); + if (!EVAS_FONT_WALK_IS_VISIBLE) continue; + + if ((x >= EVAS_FONT_WALK_PEN_X) && + (x <= (EVAS_FONT_WALK_PEN_X_AFTER)) && + (y >= -asc) && (y <= desc)) + { + ret = EVAS_FONT_WALK_POS; + goto end; + } + } + EVAS_FONT_WALK_TEXT_END(); + } end: