forked from enlightenment/efl
Evas font: Fix width query for OpenType fonts. (rewrite)
This is essentially a cleaner redo of ef817f15f0
.
Logic should be exactly the same as there, the different is that this
one shares the code between OT and non OT.
Please refer to that commit for more information.
This commit is contained in:
parent
281043e357
commit
8c6effae8e
|
@ -333,22 +333,48 @@ evas_common_font_query_size(RGBA_Font *fn, const Evas_Text_Props *text_props, in
|
|||
|
||||
if (text_props->len > 0)
|
||||
{
|
||||
const Evas_Font_Glyph_Info *glyph = text_props->info->glyph +
|
||||
size_t off = text_props->start + text_props->len - 1;
|
||||
const Evas_Font_Glyph_Info *first_glyph = text_props->info->glyph +
|
||||
text_props->start;
|
||||
const Evas_Font_Glyph_Info *last_glyph = glyph;
|
||||
const Evas_Font_Glyph_Info *last_glyph = text_props->info->glyph + off;;
|
||||
|
||||
const Evas_Font_Glyph_Info *glyph = last_glyph;
|
||||
size_t cluster = 0;
|
||||
size_t cur_cluster = 0;
|
||||
|
||||
#ifdef OT_SUPPORT
|
||||
Evas_Font_OT_Info *ot = text_props->info->ot + off;
|
||||
cluster = ot->source_cluster;
|
||||
cur_cluster = ot->source_cluster;
|
||||
#endif
|
||||
|
||||
do
|
||||
{
|
||||
Evas_Coord cur_w = 0;
|
||||
if (text_props->len > 1)
|
||||
{
|
||||
last_glyph += text_props->len - 1;
|
||||
ret_w = last_glyph[-1].pen_after;
|
||||
cur_w = last_glyph[-1].pen_after;
|
||||
if (text_props->start > 0)
|
||||
ret_w -= glyph[-1].pen_after;
|
||||
cur_w -= first_glyph[-1].pen_after;
|
||||
}
|
||||
cur_w += last_glyph->width + last_glyph->x_bear;
|
||||
#ifdef OT_SUPPORT
|
||||
ret_w += EVAS_FONT_ROUND_26_6_TO_INT(EVAS_FONT_OT_X_OFF_GET(
|
||||
cur_w += EVAS_FONT_ROUND_26_6_TO_INT(EVAS_FONT_OT_X_OFF_GET(
|
||||
text_props->info->ot[text_props->start + text_props->len - 1]));
|
||||
|
||||
cur_cluster = ot->source_cluster;
|
||||
ot--;
|
||||
#else
|
||||
cur_cluster = cluster + 1; /* Change cluster manually for no OT */
|
||||
#endif
|
||||
ret_w += last_glyph->width + last_glyph->x_bear;
|
||||
glyph--;
|
||||
|
||||
if (cur_w > ret_w)
|
||||
{
|
||||
ret_w = cur_w;
|
||||
}
|
||||
}
|
||||
while ((glyph > first_glyph) && (cur_cluster == cluster));
|
||||
}
|
||||
|
||||
if (w) *w = ret_w;
|
||||
|
|
Loading…
Reference in New Issue