forked from enlightenment/efl
Evas font-engine: Fixed walking to use ptrs instead of indexes.
I.e walk using a ptr instead of arr[i] all the time. This should make things faster. Also as part of the change, fixed char_index to be an offset inside the string object, and not a general offset which was bad. SVN revision: 57241
This commit is contained in:
parent
984361a2d3
commit
0f77f14ccc
|
@ -16,6 +16,19 @@
|
|||
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() \
|
||||
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() \
|
||||
for (char_index = 0 ; char_index < text_props->len ; char_index++, _glyph_itr++) \
|
||||
{
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @def EVAS_FONT_WALK_TEXT_VISUAL_START
|
||||
* @internal
|
||||
|
@ -31,8 +44,24 @@
|
|||
#define EVAS_FONT_WALK_TEXT_VISUAL_START() \
|
||||
do \
|
||||
{ \
|
||||
for (char_index = text_props->start ; char_index < text_props->start + text_props->len ; char_index++) \
|
||||
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
|
||||
|
@ -50,6 +79,9 @@
|
|||
#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; \
|
||||
|
@ -57,16 +89,14 @@
|
|||
{ \
|
||||
char_index = text_props->len - 1; \
|
||||
_char_index_d = -1; \
|
||||
_glyph_itr += text_props->len - 1; \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
char_index = 0; \
|
||||
_char_index_d = 1; \
|
||||
} \
|
||||
char_index += text_props->start; \
|
||||
_i += text_props->start; \
|
||||
for ( ; _i > text_props->start ; char_index += _char_index_d, _i--) \
|
||||
{
|
||||
_EVAS_FONT_WALK_TEXT_LOGICAL_START()
|
||||
|
||||
#else
|
||||
#define EVAS_FONT_WALK_TEXT_LOGICAL_START() EVAS_FONT_WALK_TEXT_VISUAL_START()
|
||||
|
@ -77,27 +107,20 @@
|
|||
/*FIXME: doc */
|
||||
#ifdef OT_SUPPORT
|
||||
# define EVAS_FONT_WALK_X_OFF \
|
||||
(EVAS_FONT_ROUND_26_6_TO_INT( \
|
||||
EVAS_FONT_OT_X_OFF_GET( \
|
||||
text_props->info->ot[char_index])))
|
||||
(EVAS_FONT_ROUND_26_6_TO_INT(EVAS_FONT_OT_X_OFF_GET(*_ot_itr)))
|
||||
# define EVAS_FONT_WALK_Y_OFF \
|
||||
(EVAS_FONT_ROUND_26_6_TO_INT( \
|
||||
EVAS_FONT_OT_Y_OFF_GET( \
|
||||
text_props->info->ot[char_index])))
|
||||
(EVAS_FONT_ROUND_26_6_TO_INT(EVAS_FONT_OT_Y_OFF_GET(*_ot_itr)))
|
||||
# define EVAS_FONT_WALK_POS \
|
||||
(EVAS_FONT_OT_POS_GET( \
|
||||
text_props->info->ot[char_index]) - text_props->text_offset)
|
||||
(EVAS_FONT_OT_POS_GET(*_ot_itr) - text_props->text_offset)
|
||||
# define EVAS_FONT_WALK_POS_NEXT \
|
||||
((!EVAS_FONT_WALK_IS_LAST) ? \
|
||||
EVAS_FONT_OT_POS_GET( \
|
||||
text_props->info->ot[char_index + 1]) - \
|
||||
text_props->text_offset : \
|
||||
EVAS_FONT_OT_POS_GET(*(_ot_itr + 1)) - \
|
||||
text_props->text_offset : \
|
||||
EVAS_FONT_WALK_POS \
|
||||
)
|
||||
# define EVAS_FONT_WALK_POS_PREV \
|
||||
((char_index > 0) ? \
|
||||
EVAS_FONT_OT_POS_GET( \
|
||||
text_props->info->ot[char_index - 1]) - \
|
||||
EVAS_FONT_OT_POS_GET(*(_ot_itr - 1)) - \
|
||||
text_props->text_offset : \
|
||||
EVAS_FONT_WALK_POS \
|
||||
)
|
||||
|
@ -106,40 +129,39 @@
|
|||
# define EVAS_FONT_WALK_Y_OFF 0
|
||||
# define EVAS_FONT_WALK_POS \
|
||||
((text_props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) ? \
|
||||
(text_props->len - (char_index - text_props->start) - 1) : \
|
||||
(char_index - text_props->start))
|
||||
(text_props->len - char_index - 1) : \
|
||||
(char_index))
|
||||
# define EVAS_FONT_WALK_POS_NEXT \
|
||||
((!EVAS_FONT_WALK_IS_LAST) ? \
|
||||
((text_props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) ? \
|
||||
text_props->len - ((char_index + 1) - text_props->start) \
|
||||
: (char_index + 1) - text_props->start) : \
|
||||
text_props->len - char_index - 2 \
|
||||
: (char_index + 1)) : \
|
||||
EVAS_FONT_WALK_POS)
|
||||
# define EVAS_FONT_WALK_POS_PREV \
|
||||
((char_index > text_props->start) ? \
|
||||
((char_index > 0) ? \
|
||||
((text_props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) ? \
|
||||
text_props->len - ((char_index - 1) - text_props->start) \
|
||||
: (char_index - 1) - text_props->start) : \
|
||||
text_props->len - char_index \
|
||||
: (char_index - 1)) : \
|
||||
EVAS_FONT_WALK_POS)
|
||||
#endif
|
||||
|
||||
|
||||
#define EVAS_FONT_WALK_IS_VISIBLE \
|
||||
(text_props->info->glyph[char_index].index != 0)
|
||||
#define EVAS_FONT_WALK_X_BEAR (text_props->info->glyph[char_index].x_bear)
|
||||
#define EVAS_FONT_WALK_IS_VISIBLE (_glyph_itr->index != 0)
|
||||
#define EVAS_FONT_WALK_X_BEAR (_glyph_itr->x_bear)
|
||||
#define EVAS_FONT_WALK_Y_BEAR (fg->glyph_out->top)
|
||||
#define _EVAS_FONT_WALK_X_ADV \
|
||||
(text_props->info->glyph[char_index].advance)
|
||||
#define EVAS_FONT_WALK_WIDTH (text_props->info->glyph[char_index].width)
|
||||
#define _EVAS_FONT_WALK_X_ADV (_glyph_itr->advance)
|
||||
#define EVAS_FONT_WALK_WIDTH (_glyph_itr->width)
|
||||
|
||||
#define EVAS_FONT_WALK_INDEX (_glyph_itr->index)
|
||||
#define EVAS_FONT_WALK_X_ADV \
|
||||
(EVAS_FONT_ROUND_26_6_TO_INT(_EVAS_FONT_WALK_X_ADV))
|
||||
#define EVAS_FONT_WALK_PEN_X (EVAS_FONT_ROUND_26_6_TO_INT(_pen_x))
|
||||
#define EVAS_FONT_WALK_PEN_Y (EVAS_FONT_ROUND_26_6_TO_INT(_pen_y))
|
||||
#define EVAS_FONT_WALK_Y_ADV (0)
|
||||
#define EVAS_FONT_WALK_IS_LAST \
|
||||
(char_index + 1 == text_props->start + text_props->len)
|
||||
(char_index + 1 == text_props->len)
|
||||
#define EVAS_FONT_WALK_IS_FIRST \
|
||||
(!char_index)
|
||||
(char_index == 0)
|
||||
#define EVAS_FONT_WALK_LEN (text_props->len)
|
||||
|
||||
/**
|
||||
|
|
|
@ -529,7 +529,7 @@ evas_common_font_draw_internal(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font
|
|||
if (!EVAS_FONT_WALK_IS_VISIBLE) continue;
|
||||
|
||||
#ifdef OT_SUPPORT
|
||||
index = text_props->info->glyph[char_index].index;
|
||||
index = EVAS_FONT_WALK_INDEX;
|
||||
#else
|
||||
/* FIXME: Should be removed once we split according to script without
|
||||
* the use of harfbuzz */
|
||||
|
@ -787,6 +787,7 @@ evas_font_word_prerender(RGBA_Draw_Context *dc, const Eina_Unicode *in_text, con
|
|||
struct prword *w;
|
||||
int last_delta = 0;
|
||||
int gl;
|
||||
struct cinfo *ci;
|
||||
EVAS_FONT_WALK_TEXT_INIT();
|
||||
|
||||
# ifndef METRIC_CACHE
|
||||
|
@ -829,13 +830,13 @@ evas_font_word_prerender(RGBA_Draw_Context *dc, const Eina_Unicode *in_text, con
|
|||
* but that'll have to be good enough ATM */
|
||||
len = text_props->len;
|
||||
metrics = malloc(sizeof(struct cinfo) * len);
|
||||
ci = metrics;
|
||||
EVAS_FONT_WALK_TEXT_VISUAL_START()
|
||||
{
|
||||
struct cinfo *ci = metrics + char_index;
|
||||
FT_UInt index;
|
||||
RGBA_Font_Glyph *fg;
|
||||
#ifdef OT_SUPPORT
|
||||
index = text_props->info->glyph[char_index].index;
|
||||
index = EVAS_FONT_WALK_INDEX;
|
||||
#else
|
||||
/* FIXME: Should be removed once we split according to script without
|
||||
* the use of harfbuzz */
|
||||
|
@ -874,6 +875,7 @@ evas_font_word_prerender(RGBA_Draw_Context *dc, const Eina_Unicode *in_text, con
|
|||
ci->pos.y = EVAS_FONT_WALK_PEN_Y + EVAS_FONT_WALK_Y_OFF + EVAS_FONT_WALK_Y_BEAR;
|
||||
last_delta = EVAS_FONT_WALK_X_ADV -
|
||||
(ci->bm.w + ci->fg->glyph_out->left);
|
||||
ci++;
|
||||
}
|
||||
EVAS_FONT_WALK_TEXT_END();
|
||||
|
||||
|
|
|
@ -18,7 +18,9 @@ evas_common_font_ot_cluster_size_get(const Evas_Text_Props *props, size_t char_i
|
|||
int i;
|
||||
int items;
|
||||
int left_bound, right_bound;
|
||||
size_t base_cluster = EVAS_FONT_OT_POS_GET(props->info->ot[char_index]);
|
||||
size_t base_cluster;
|
||||
char_index += props->start;
|
||||
base_cluster = EVAS_FONT_OT_POS_GET(props->info->ot[char_index]);
|
||||
for (i = (int) char_index ;
|
||||
(i >= (int) props->start) &&
|
||||
(EVAS_FONT_OT_POS_GET(props->info->ot[i]) == base_cluster) ;
|
||||
|
|
Loading…
Reference in New Issue