Evas font: Removed LOGICAL_WALK and updated last_up_to_pos accondingly.

SVN revision: 58758
This commit is contained in:
Tom Hacohen 2011-04-20 14:20:57 +00:00
parent b59156c788
commit 6609b1d7ba
3 changed files with 70 additions and 80 deletions

View File

@ -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

View File

@ -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;

View File

@ -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: