fix font rounding in evas to round and not floor - fixes some rare

font sizing issues.



SVN revision: 77688
This commit is contained in:
Carsten Haitzler 2012-10-10 06:07:38 +00:00
parent f91826870d
commit aad2041e55
5 changed files with 33 additions and 12 deletions

View File

@ -1086,3 +1086,8 @@
This change adds Eo support to Evas while keeping the old API intact.
For more information, go to Eo.
2012-10-10 Carsten Haitzler (The Rasterman)
* Fix font sizing issues when size scaling happens to down down
when it should round up. happens in rare sizing situations and fonts.

View File

@ -25,6 +25,7 @@ Fixes:
* Fix evas_object_image_alpha_set when image data not loaded yet.
* Fix map surface leak.
* Fix native surface set to null crash bug in gl engine.
* Fix font sizing issue with some rare sizes and fonts when rounding wrong.
Removal:
* No more support s3c6410.

View File

@ -455,13 +455,13 @@ evas_common_font_int_load_complete(RGBA_Font_Int *fi)
if (fi->src->ft.face->units_per_EM != 0)
{
dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
ret = FONT_MERTIC_CONV(val, dv, fi->src->ft.face->size->metrics.y_scale);
}
else
{
if ((fi->src->ft.face->bbox.yMax == 0) &&
(fi->src->ft.face->bbox.yMin == 0))
ret = (int)fi->ft.size->metrics.ascender / 64;
ret = FONT_METRIC_ROUNDUP((int)fi->ft.size->metrics.ascender);
else
ret = val;
}
@ -470,13 +470,13 @@ evas_common_font_int_load_complete(RGBA_Font_Int *fi)
if (fi->src->ft.face->units_per_EM != 0)
{
dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
ret = FONT_MERTIC_CONV(val, dv, fi->src->ft.face->size->metrics.y_scale);
}
else
{
if ((fi->src->ft.face->bbox.yMax == 0) &&
(fi->src->ft.face->bbox.yMin == 0))
ret = -(int)fi->ft.size->metrics.descender / 64;
ret = FONT_METRIC_ROUNDUP(-(int)fi->ft.size->metrics.descender);
else
ret = val;
}

View File

@ -112,7 +112,7 @@ evas_common_font_ascent_get(RGBA_Font *fn)
WRN("NOT SCALABLE!");
}
val = (int)fi->src->ft.face->size->metrics.ascender;
return val >> 6;
return FONT_METRIC_ROUNDUP(val);
// printf("%i | %i\n", val, val >> 6);
// if (fi->src->ft.face->units_per_EM == 0)
// return val;
@ -138,7 +138,7 @@ evas_common_font_descent_get(RGBA_Font *fn)
fi->src->current_size = fi->size;
}
val = -(int)fi->src->ft.face->size->metrics.descender;
return val >> 6;
return FONT_METRIC_ROUNDUP(val);
// if (fi->src->ft.face->units_per_EM == 0)
// return val;
// dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
@ -166,13 +166,13 @@ evas_common_font_max_ascent_get(RGBA_Font *fn)
if ((fi->src->ft.face->bbox.yMax == 0) &&
(fi->src->ft.face->bbox.yMin == 0) &&
(fi->src->ft.face->units_per_EM == 0))
val = (int)fi->src->ft.face->size->metrics.ascender / 64;
val = FONT_METRIC_ROUNDUP((int)fi->src->ft.face->size->metrics.ascender);
else
val = (int)fi->src->ft.face->bbox.yMax;
if (fi->src->ft.face->units_per_EM == 0)
return val;
dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
ret = FONT_MERTIC_CONV(val, dv, fi->src->ft.face->size->metrics.y_scale);
return ret;
}
@ -196,13 +196,13 @@ evas_common_font_max_descent_get(RGBA_Font *fn)
if ((fi->src->ft.face->bbox.yMax == 0) &&
(fi->src->ft.face->bbox.yMin == 0) &&
(fi->src->ft.face->units_per_EM == 0))
val = -(int)fi->src->ft.face->size->metrics.descender / 64;
val = FONT_METRIC_ROUNDUP(-(int)fi->src->ft.face->size->metrics.descender);
else
val = -(int)fi->src->ft.face->bbox.yMin;
if (fi->src->ft.face->units_per_EM == 0)
return val;
dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
ret = FONT_MERTIC_CONV(val, dv, fi->src->ft.face->size->metrics.y_scale);
return ret;
}
@ -226,10 +226,10 @@ evas_common_font_get_line_advance(RGBA_Font *fn)
if ((fi->src->ft.face->bbox.yMax == 0) &&
(fi->src->ft.face->bbox.yMin == 0) &&
(fi->src->ft.face->units_per_EM == 0))
return val >> 6;
return FONT_METRIC_ROUNDUP(val);
else if (fi->src->ft.face->units_per_EM == 0)
return val;
return val >> 6;
return FONT_METRIC_ROUNDUP(val);
// dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM;
// ret = (val * fi->src->ft.face->size->metrics.y_scale) / (dv * dv);
// return ret;

View File

@ -46,5 +46,20 @@ void evas_common_font_int_reload(RGBA_Font_Int *fi);
((0x202A <= (x)) && ((x) <= 0x202E)) /* BIDI stuff */ \
)
# if 1
// do proper round (up or down like 1.4 -> 1 and 1.6 -> 2 etc
# define FONT_MERTIC_CONV(val, dv, scale) \
(((long long)((val) * (scale)) + (long long)((dv) * (dv) / 2LL)) \
/ (long long)((dv) * (dv)))
# define FONT_METRIC_ROUNDUP(val) \
(((val) + 31) >> 6)
# else
// truncate/round down
# define FONT_MERTIC_CONV(val, dv, scale) \
(((val) * (scale)) / ((dv) * (dv)))
# define FONT_METRIC_ROUNDUP(val) \
((val) >> 6)
# endif
# include "evas_font_default_walk.x"
#endif /* !_EVAS_FONT_PRIVATE_H */