Evas font: Renamed the parameter names in evas_common_font_query_kerning to be more correct. Adjusted font query and font draw according to the correct font_query_kerning behavior.

SVN revision: 51724
This commit is contained in:
Tom Hacohen 2010-08-29 12:44:58 +00:00
parent 58319c5715
commit 7cd4d7cf4a
3 changed files with 80 additions and 93 deletions

View File

@ -60,7 +60,7 @@ EAPI void evas_common_font_all_clear (void);
/* query */ /* query */
EAPI int evas_common_font_query_kerning (RGBA_Font_Int* fi, FT_UInt prev, FT_UInt index, int* kerning); EAPI int evas_common_font_query_kerning (RGBA_Font_Int* fi, FT_UInt left, FT_UInt right, int* kerning);
EAPI void evas_common_font_query_size (RGBA_Font *fn, const Eina_Unicode *text, const Evas_BiDi_Props *intl_props, int *w, int *h); EAPI void evas_common_font_query_size (RGBA_Font *fn, const Eina_Unicode *text, const Evas_BiDi_Props *intl_props, int *w, int *h);
EAPI int evas_common_font_query_inset (RGBA_Font *fn, const Eina_Unicode *text); EAPI int evas_common_font_query_inset (RGBA_Font *fn, const Eina_Unicode *text);
EAPI void evas_common_font_query_advance (RGBA_Font *fn, const Eina_Unicode *text, const Evas_BiDi_Props *intl_props, int *h_adv, int *v_adv); EAPI void evas_common_font_query_advance (RGBA_Font *fn, const Eina_Unicode *text, const Evas_BiDi_Props *intl_props, int *h_adv, int *v_adv);

View File

@ -539,25 +539,8 @@ evas_common_font_draw_internal(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font
if ((use_kerning) && (prev_index) && (index) && if ((use_kerning) && (prev_index) && (index) &&
(pface == fi->src->ft.face)) (pface == fi->src->ft.face))
{ {
#ifdef BIDI_SUPPORT if (evas_common_font_query_kerning(fi, prev_index, index, &kern))
/* if it's rtl, the kerning matching should be reversed, i.e prev pen_x += kern;
* index is now the index and the other way around.
* There is a slight exception when there are compositing chars
* involved.*/
if (intl_props && intl_props->props &&
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;
}
else
#endif
{
if (evas_common_font_query_kerning(fi, prev_index, index, &kern))
pen_x += kern;
}
} }
pface = fi->src->ft.face; pface = fi->src->ft.face;
LKU(fi->ft_mutex); LKU(fi->ft_mutex);

View File

@ -4,7 +4,7 @@
EAPI int EAPI int
evas_common_font_query_kerning(RGBA_Font_Int* fi, evas_common_font_query_kerning(RGBA_Font_Int* fi,
FT_UInt prev, FT_UInt index, FT_UInt left, FT_UInt right,
int* kerning) int* kerning)
{ {
int *result; int *result;
@ -13,8 +13,8 @@ evas_common_font_query_kerning(RGBA_Font_Int* fi,
int error = 1; int error = 1;
// return 0; // return 0;
key[0] = prev; key[0] = left;
key[1] = index; key[1] = right;
result = eina_hash_find(fi->kerning, key); result = eina_hash_find(fi->kerning, key);
if (result) if (result)
@ -70,6 +70,7 @@ evas_common_font_query_size(RGBA_Font *fn, const Eina_Unicode *text, const Evas_
int pen_x, pen_y; int pen_x, pen_y;
int start_x, end_x; int start_x, end_x;
int chr; int chr;
int char_index;
FT_UInt prev_index; FT_UInt prev_index;
RGBA_Font_Int *fi; RGBA_Font_Int *fi;
FT_Face pface = NULL; FT_Face pface = NULL;
@ -84,7 +85,7 @@ evas_common_font_query_size(RGBA_Font *fn, const Eina_Unicode *text, const Evas_
// evas_common_font_size_use(fn); // evas_common_font_size_use(fn);
use_kerning = FT_HAS_KERNING(fi->src->ft.face); use_kerning = FT_HAS_KERNING(fi->src->ft.face);
prev_index = 0; prev_index = 0;
for (chr = 0; *text; text++) for (chr = 0, char_index = 0; *text; text++, char_index ++)
{ {
FT_UInt index; FT_UInt index;
RGBA_Font_Glyph *fg; RGBA_Font_Glyph *fg;
@ -102,14 +103,33 @@ evas_common_font_query_size(RGBA_Font *fn, const Eina_Unicode *text, const Evas_
FTUNLOCK(); FTUNLOCK();
fi->src->current_size = fi->size; fi->src->current_size = fi->size;
} }
/* hmmm kerning means i can't sanely do my own cached metric tables! */ kern = 0;
/* hmmm kerning means i can't sanely do my own cached metric tables! */
/* grrr - this means font face sharing is kinda... not an option if */ /* grrr - this means font face sharing is kinda... not an option if */
/* you want performance */ /* you want performance */
kern = 0;
if ((use_kerning) && (prev_index) && (index) && if ((use_kerning) && (prev_index) && (index) &&
(pface == fi->src->ft.face) && (pface == fi->src->ft.face))
evas_common_font_query_kerning(fi, prev_index, index, &kern)) {
pen_x += kern; #ifdef BIDI_SUPPORT
/* 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)
{
if (evas_common_font_query_kerning(fi, index, prev_index, &kern))
pen_x += kern;
}
else
#endif
{
if (evas_common_font_query_kerning(fi, prev_index, index, &kern))
pen_x += kern;
}
}
pface = fi->src->ft.face; pface = fi->src->ft.face;
fg = evas_common_font_int_cache_glyph_get(fi, index); fg = evas_common_font_int_cache_glyph_get(fi, index);
@ -253,24 +273,24 @@ evas_common_font_query_advance(RGBA_Font *fn, const Eina_Unicode *text, const Ev
(pface == fi->src->ft.face)) (pface == fi->src->ft.face))
{ {
#ifdef BIDI_SUPPORT #ifdef BIDI_SUPPORT
/* if it's rtl, the kerning matching should be reversed, i.e prev /* if it's rtl, the kerning matching should be reversed, i.e prev
* index is now the index and the other way around. * index is now the index and the other way around.
* There is a slight exception when there are compositing chars * There is a slight exception when there are compositing chars
* involved.*/ * involved.*/
if (intl_props && if (intl_props &&
evas_bidi_is_rtl_char(intl_props->props->embedding_levels, char_index) && evas_bidi_is_rtl_char(intl_props->props->embedding_levels, char_index) &&
fg->glyph->advance.x >> 16 > 0) fg->glyph->advance.x >> 16 > 0)
{ {
if (evas_common_font_query_kerning(fi, index, prev_index, &kern)) if (evas_common_font_query_kerning(fi, index, prev_index, &kern))
pen_x += kern; pen_x += kern;
} }
else else
#endif #endif
{ {
if (evas_common_font_query_kerning(fi, prev_index, index, &kern)) if (evas_common_font_query_kerning(fi, prev_index, index, &kern))
pen_x += kern; pen_x += kern;
} }
} }
pface = fi->src->ft.face; pface = fi->src->ft.face;
@ -378,30 +398,13 @@ evas_common_font_query_char_coords(RGBA_Font *fn, const Eina_Unicode *in_text, c
if ((use_kerning) && (prev_index) && (index) && if ((use_kerning) && (prev_index) && (index) &&
(pface == fi->src->ft.face)) (pface == fi->src->ft.face))
{ {
#ifdef BIDI_SUPPORT if (evas_common_font_query_kerning(fi, prev_index, index, &kern))
/* if it's rtl, the kerning matching should be reversed, i.e prev pen_x += kern;
* 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)
{
if (evas_common_font_query_kerning(fi, index, prev_index, &kern))
pen_x += kern;
}
else
#endif
{
if (evas_common_font_query_kerning(fi, prev_index, index, &kern))
pen_x += kern;
}
} }
pface = fi->src->ft.face; pface = fi->src->ft.face;
LKU(fi->ft_mutex); LKU(fi->ft_mutex);
/* If the current one is not a compositing char, do the previous advance /* If the current one is not a compositing char, do the previous advance
* and set the current advance as the next advance to do */ * and set the current advance as the next advance to do */
if (fg->glyph->advance.x >> 16 > 0) if (fg->glyph->advance.x >> 16 > 0)
{ {
@ -535,25 +538,8 @@ evas_common_font_query_char_at_coords(RGBA_Font *fn, const Eina_Unicode *in_text
if ((use_kerning) && (prev_index) && (index) && if ((use_kerning) && (prev_index) && (index) &&
(pface == fi->src->ft.face)) (pface == fi->src->ft.face))
{ {
#ifdef BIDI_SUPPORT if (evas_common_font_query_kerning(fi, prev_index, index, &kern))
/* if it's rtl, the kerning matching should be reversed, i.e prev pen_x += kern;
* 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)
{
if (evas_common_font_query_kerning(fi, index, prev_index, &kern))
pen_x += kern;
}
else
#endif
{
if (evas_common_font_query_kerning(fi, prev_index, index, &kern))
pen_x += kern;
}
} }
pface = fi->src->ft.face; pface = fi->src->ft.face;
LKU(fi->ft_mutex); LKU(fi->ft_mutex);
@ -665,17 +651,35 @@ evas_common_font_query_last_up_to_pos(RGBA_Font *fn, const Eina_Unicode *in_text
FTUNLOCK(); FTUNLOCK();
fi->src->current_size = fi->size; fi->src->current_size = fi->size;
} }
kern = 0; kern = 0;
/* hmmm kerning means i can't sanely do my own cached metric tables! */ /* hmmm kerning means i can't sanely do my own cached metric tables! */
/* grrr - this means font face sharing is kinda... not an option if */ /* grrr - this means font face sharing is kinda... not an option if */
/* you want performance */ /* you want performance */
if ((use_kerning) && (prev_index) && (index) && if ((use_kerning) && (prev_index) && (index) &&
(pface == fi->src->ft.face)) (pface == fi->src->ft.face))
{ {
/* No need for special RTL handling because we are working on the logical string*/ #ifdef BIDI_SUPPORT
if (evas_common_font_query_kerning(fi, index, prev_index, &kern)) /* if it's rtl, the kerning matching should be reversed, i.e prev
pen_x += kern; * 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)
{
if (evas_common_font_query_kerning(fi, index, prev_index,
&kern))
pen_x += kern;
}
else
#endif
{
if (evas_common_font_query_kerning(fi, prev_index, index,
&kern))
pen_x += kern;
}
}
pface = fi->src->ft.face; pface = fi->src->ft.face;
fg = evas_common_font_int_cache_glyph_get(fi, index); fg = evas_common_font_int_cache_glyph_get(fi, index);
LKU(fi->ft_mutex); LKU(fi->ft_mutex);