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. This change adds Eo support to Evas while keeping the old API intact.
For more information, go to Eo. 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 evas_object_image_alpha_set when image data not loaded yet.
* Fix map surface leak. * Fix map surface leak.
* Fix native surface set to null crash bug in gl engine. * 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: Removal:
* No more support s3c6410. * 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) if (fi->src->ft.face->units_per_EM != 0)
{ {
dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM; 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 else
{ {
if ((fi->src->ft.face->bbox.yMax == 0) && if ((fi->src->ft.face->bbox.yMax == 0) &&
(fi->src->ft.face->bbox.yMin == 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 else
ret = val; 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) if (fi->src->ft.face->units_per_EM != 0)
{ {
dv = (fi->src->ft.orig_upem * 2048) / fi->src->ft.face->units_per_EM; 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 else
{ {
if ((fi->src->ft.face->bbox.yMax == 0) && if ((fi->src->ft.face->bbox.yMax == 0) &&
(fi->src->ft.face->bbox.yMin == 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 else
ret = val; ret = val;
} }

View File

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

View File

@ -46,5 +46,20 @@ void evas_common_font_int_reload(RGBA_Font_Int *fi);
((0x202A <= (x)) && ((x) <= 0x202E)) /* BIDI stuff */ \ ((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" # include "evas_font_default_walk.x"
#endif /* !_EVAS_FONT_PRIVATE_H */ #endif /* !_EVAS_FONT_PRIVATE_H */