diff --git a/legacy/evas/ChangeLog b/legacy/evas/ChangeLog index 792e9ba59a..36bf2240cc 100644 --- a/legacy/evas/ChangeLog +++ b/legacy/evas/ChangeLog @@ -780,3 +780,11 @@ * Fix evas_free callback deletion to not sometimes abort evas freeing in some situations, thus leaking. +2012-06-10 Carsten Haitzler (The Rasterman) + + * Fix evas font handling so bitmap fonts work again like they + once did. This ifxes max height, and max ascent/descent + calculation for 0 em fonts with 0 bbox size (bitmap case), and + fixes 1 rounding error in text objects that placed ascent in the wrong + place by 1 pixel for even ascents. + diff --git a/legacy/evas/src/lib/canvas/evas_object_text.c b/legacy/evas/src/lib/canvas/evas_object_text.c index c410b71665..2795f8cb28 100644 --- a/legacy/evas/src/lib/canvas/evas_object_text.c +++ b/legacy/evas/src/lib/canvas/evas_object_text.c @@ -1507,7 +1507,7 @@ evas_object_text_render(Evas_Object *obj, void *output, void *context, void *sur obj->cur.geometry.x + x + sl + ox + it->x, \ obj->cur.geometry.y + y + st + oy + \ (int) \ - (((o->max_ascent * obj->cur.geometry.h) / obj->cur.geometry.h) - 0.5), \ + (((o->max_ascent * obj->cur.geometry.h) / obj->cur.geometry.h)), \ obj->cur.geometry.w, \ obj->cur.geometry.h, \ obj->cur.geometry.w, \ 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 9dc3d48466..4a0375121d 100644 --- a/legacy/evas/src/lib/engines/common/evas_font_load.c +++ b/legacy/evas/src/lib/engines/common/evas_font_load.c @@ -423,7 +423,14 @@ evas_common_font_int_load_complete(RGBA_Font_Int *fi) 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); } - else ret = val; + else + { + if ((fi->src->ft.face->bbox.yMax == 0) && + (fi->src->ft.face->bbox.yMin == 0)) + ret = (int)fi->ft.size->metrics.ascender / 64; + else + ret = val; + } fi->max_h += ret; val = -(int)fi->src->ft.face->bbox.yMin; if (fi->src->ft.face->units_per_EM != 0) @@ -431,7 +438,14 @@ evas_common_font_int_load_complete(RGBA_Font_Int *fi) 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); } - else ret = val; + else + { + if ((fi->src->ft.face->bbox.yMax == 0) && + (fi->src->ft.face->bbox.yMin == 0)) + ret = -(int)fi->ft.size->metrics.descender / 64; + else + ret = val; + } fi->max_h += ret; /* If the loaded font doesn't match with wanted_rend value requested by 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 94f4f772f9..06e0f9db3e 100644 --- a/legacy/evas/src/lib/engines/common/evas_font_main.c +++ b/legacy/evas/src/lib/engines/common/evas_font_main.c @@ -158,7 +158,12 @@ evas_common_font_max_ascent_get(RGBA_Font *fn) FTUNLOCK(); fi->src->current_size = fi->size; } - val = (int)fi->src->ft.face->bbox.yMax; + 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; + 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; @@ -183,7 +188,12 @@ evas_common_font_max_descent_get(RGBA_Font *fn) FTUNLOCK(); fi->src->current_size = fi->size; } - val = -(int)fi->src->ft.face->bbox.yMin; + 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; + 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;