forked from enlightenment/efl
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:
parent
58319c5715
commit
7cd4d7cf4a
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue