From 01850cf8166751618700efcdddd8bd2428426a62 Mon Sep 17 00:00:00 2001 From: Tom Hacohen Date: Sun, 30 Jan 2011 10:35:24 +0000 Subject: [PATCH] Evas font-engine: Fixed kerning handling and fixed a bug in query_char_coords and in query_pen_coords taking the wrong string into account. SVN revision: 56444 --- .../evas/src/lib/engines/common/evas_font_draw.c | 2 +- .../src/lib/engines/common/evas_font_private.h | 11 ++++++----- .../src/lib/engines/common/evas_font_query.c | 16 ++++++++-------- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/legacy/evas/src/lib/engines/common/evas_font_draw.c b/legacy/evas/src/lib/engines/common/evas_font_draw.c index 3af06036f2..d02c26fa7a 100644 --- a/legacy/evas/src/lib/engines/common/evas_font_draw.c +++ b/legacy/evas/src/lib/engines/common/evas_font_draw.c @@ -529,7 +529,7 @@ evas_common_font_draw_internal(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font if (EVAS_FONT_CHARACTER_IS_INVISIBLE(gl)) continue; - EVAS_FONT_WALK_TEXT_WORK(); + EVAS_FONT_WALK_TEXT_WORK(EINA_TRUE); if (dc->font_ext.func.gl_new) { diff --git a/legacy/evas/src/lib/engines/common/evas_font_private.h b/legacy/evas/src/lib/engines/common/evas_font_private.h index 40a655c07a..b6f83860f1 100644 --- a/legacy/evas/src/lib/engines/common/evas_font_private.h +++ b/legacy/evas/src/lib/engines/common/evas_font_private.h @@ -44,7 +44,7 @@ void evas_common_font_int_reload(RGBA_Font_Int *fi); * intl_props, char_index, adv, fi, kern, pen_x */ #ifdef BIDI_SUPPORT -#define EVAS_FONT_UPDATE_KERN() \ +#define EVAS_FONT_UPDATE_KERN(is_visual) \ do \ { \ /* if it's rtl, the kerning matching should be reversed, */ \ @@ -52,7 +52,7 @@ void evas_common_font_int_reload(RGBA_Font_Int *fi); /* around. There is a slight exception when there are */ \ /* compositing chars involved.*/ \ if (intl_props && (intl_props->dir == EVAS_BIDI_DIRECTION_RTL) && \ - adv > 0) \ + visible && !is_visual) \ { \ if (evas_common_font_query_kerning(fi, index, prev_index, &kern)) \ pen_x += kern; \ @@ -65,9 +65,10 @@ void evas_common_font_int_reload(RGBA_Font_Int *fi); } \ while (0) #else -#define EVAS_FONT_UPDATE_KERN() \ +#define EVAS_FONT_UPDATE_KERN(is_visual) \ do \ { \ + (void) is_visual; \ if (evas_common_font_query_kerning(fi, prev_index, index, &kern)) \ pen_x += kern; \ } \ @@ -131,7 +132,7 @@ void evas_common_font_int_reload(RGBA_Font_Int *fi); * @see EVAS_FONT_WALK_TEXT_INIT * @see EVAS_FONT_WALK_TEXT_END */ -#define EVAS_FONT_WALK_TEXT_WORK() \ +#define EVAS_FONT_WALK_TEXT_WORK(is_visual) \ index = evas_common_font_glyph_search(fn, &fi, gl); \ LKL(fi->ft_mutex); \ fg = evas_common_font_int_cache_glyph_get(fi, index); \ @@ -160,7 +161,7 @@ void evas_common_font_int_reload(RGBA_Font_Int *fi); if ((use_kerning) && (prev_index) && (index) && \ (pface == fi->src->ft.face)) \ { \ - EVAS_FONT_UPDATE_KERN(); \ + EVAS_FONT_UPDATE_KERN(is_visual); \ } \ \ pface = fi->src->ft.face; \ diff --git a/legacy/evas/src/lib/engines/common/evas_font_query.c b/legacy/evas/src/lib/engines/common/evas_font_query.c index 1ebaa9dbbb..b7074746dd 100644 --- a/legacy/evas/src/lib/engines/common/evas_font_query.c +++ b/legacy/evas/src/lib/engines/common/evas_font_query.c @@ -148,7 +148,7 @@ evas_common_font_query_size(RGBA_Font *fn, const Eina_Unicode *text, const Evas_ EVAS_FONT_WALK_TEXT_START() { - EVAS_FONT_WALK_TEXT_WORK(); + EVAS_FONT_WALK_TEXT_WORK(EINA_FALSE); /* Keep the width because we'll need it for the last char */ keep_width = width + bear_x; /* Keep the previous pen_x, before it's advanced in TEXT_END */ @@ -181,7 +181,7 @@ evas_common_font_query_advance(RGBA_Font *fn, const Eina_Unicode *text, const Ev EVAS_FONT_WALK_TEXT_START() { - EVAS_FONT_WALK_TEXT_WORK(); + EVAS_FONT_WALK_TEXT_WORK(EINA_FALSE); } EVAS_FONT_WALK_TEXT_END(); @@ -256,7 +256,7 @@ evas_common_font_query_char_coords(RGBA_Font *fn, const Eina_Unicode *in_text, c else #endif { - evas_common_font_query_advance(fn, text, intl_props, cx, ch); + evas_common_font_query_advance(fn, in_text, intl_props, cx, ch); } if (cy) *cy = 0; if (cw) *cw = 0; @@ -268,7 +268,7 @@ evas_common_font_query_char_coords(RGBA_Font *fn, const Eina_Unicode *in_text, c { int chr_x, chr_y, chr_w; - EVAS_FONT_WALK_TEXT_WORK(); + EVAS_FONT_WALK_TEXT_WORK(EINA_TRUE); chr_x = (pen_x) + bear_x; chr_y = (pen_y) + bear_y; @@ -362,7 +362,7 @@ evas_common_font_query_pen_coords(RGBA_Font *fn, const Eina_Unicode *in_text, co else #endif { - evas_common_font_query_advance(fn, text, intl_props, cpen_x, ch); + evas_common_font_query_advance(fn, in_text, intl_props, cpen_x, ch); } if (cy) *cy = 0; if (cadv) *cadv = 0; @@ -372,7 +372,7 @@ evas_common_font_query_pen_coords(RGBA_Font *fn, const Eina_Unicode *in_text, co EVAS_FONT_WALK_TEXT_START() { - EVAS_FONT_WALK_TEXT_WORK(); + EVAS_FONT_WALK_TEXT_WORK(EINA_TRUE); /* we need to see if the char at the visual position is the char wanted */ if (char_index == position) { @@ -444,7 +444,7 @@ evas_common_font_query_char_at_coords(RGBA_Font *fn, const Eina_Unicode *in_text { int chr_x, chr_w; - EVAS_FONT_WALK_TEXT_WORK(); + EVAS_FONT_WALK_TEXT_WORK(EINA_TRUE); chr_x = (pen_x) + bear_x; chr_w = width; @@ -502,7 +502,7 @@ evas_common_font_query_last_up_to_pos(RGBA_Font *fn, const Eina_Unicode *in_text desc = evas_common_font_max_descent_get(fn); EVAS_FONT_WALK_TEXT_START() { - EVAS_FONT_WALK_TEXT_WORK(); + EVAS_FONT_WALK_TEXT_WORK(EINA_FALSE); if ((x >= pen_x) && (x <= (pen_x + adv)) && (y >= -asc) && (y <= desc))