diff --git a/legacy/evas/ChangeLog b/legacy/evas/ChangeLog index 8ee08f965b..83c997651e 100644 --- a/legacy/evas/ChangeLog +++ b/legacy/evas/ChangeLog @@ -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. + diff --git a/legacy/evas/NEWS b/legacy/evas/NEWS index e06cfe7e25..b0ac447717 100644 --- a/legacy/evas/NEWS +++ b/legacy/evas/NEWS @@ -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. diff --git a/legacy/evas/src/lib/engines/common/evas_font_load.c b/legacy/evas/src/lib/engines/common/evas_font_load.c index 33126ad129..11b46f9bd3 100644 --- a/legacy/evas/src/lib/engines/common/evas_font_load.c +++ b/legacy/evas/src/lib/engines/common/evas_font_load.c @@ -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; } diff --git a/legacy/evas/src/lib/engines/common/evas_font_main.c b/legacy/evas/src/lib/engines/common/evas_font_main.c index ecbe263059..1154bd7e12 100644 --- a/legacy/evas/src/lib/engines/common/evas_font_main.c +++ b/legacy/evas/src/lib/engines/common/evas_font_main.c @@ -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; diff --git a/legacy/evas/src/lib/engines/common/evas_font_private.h b/legacy/evas/src/lib/engines/common/evas_font_private.h index 2a2a382f89..c50cbb0c46 100644 --- a/legacy/evas/src/lib/engines/common/evas_font_private.h +++ b/legacy/evas/src/lib/engines/common/evas_font_private.h @@ -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 */