diff --git a/src/lib/evas/common/evas_font.h b/src/lib/evas/common/evas_font.h index 403b501941..cf6739e33c 100644 --- a/src/lib/evas/common/evas_font.h +++ b/src/lib/evas/common/evas_font.h @@ -18,6 +18,8 @@ EAPI int evas_common_font_instance_ascent_get (RGBA_Font EAPI int evas_common_font_instance_descent_get (RGBA_Font_Int *fi); EAPI int evas_common_font_instance_max_ascent_get (RGBA_Font_Int *fi); EAPI int evas_common_font_instance_max_descent_get (RGBA_Font_Int *fi); +EAPI int evas_common_font_instance_underline_position_get (RGBA_Font_Int *fi); +EAPI int evas_common_font_instance_underline_thickness_get (RGBA_Font_Int *fi); EAPI int evas_common_font_get_line_advance (RGBA_Font *fn); /* draw */ diff --git a/src/lib/evas/common/evas_font_main.c b/src/lib/evas/common/evas_font_main.c index 23ba95b0fc..32c7e379b1 100644 --- a/src/lib/evas/common/evas_font_main.c +++ b/src/lib/evas/common/evas_font_main.c @@ -230,6 +230,62 @@ evas_common_font_get_line_advance(RGBA_Font *fn) // return ret; } +EAPI int +evas_common_font_instance_underline_position_get(RGBA_Font_Int *fi) +{ + int position = 0; + + if (!fi) goto end; + + evas_common_font_int_reload(fi); + if (fi->src->current_size != fi->size) + { + FTLOCK(); + FT_Activate_Size(fi->ft.size); + FTUNLOCK(); + fi->src->current_size = fi->size; + } + + position = FT_MulFix(fi->src->ft.face->underline_position, + fi->src->ft.face->size->metrics.x_scale); + position = FONT_METRIC_ROUNDUP(abs(position)); + +end: + /* This almost surely means a broken font, offset at least by one pixel. */ + if (position == 0) + position = 1; + + return position; +} + +EAPI int +evas_common_font_instance_underline_thickness_get(RGBA_Font_Int *fi) +{ + int thickness = 0; + + if (!fi) goto end; + + evas_common_font_int_reload(fi); + if (fi->src->current_size != fi->size) + { + FTLOCK(); + FT_Activate_Size(fi->ft.size); + FTUNLOCK(); + fi->src->current_size = fi->size; + } + + thickness = FT_MulFix(fi->src->ft.face->underline_thickness, + fi->src->ft.face->size->metrics.x_scale); + thickness = FONT_METRIC_ROUNDUP(thickness); + +end: + /* This almost surely means a broken font, make it at least one pixel. */ + if (thickness == 0) + thickness = 1; + + return thickness; +} + /* Set of common functions that are used in a couple of places. */ static void