From 9d96a8ec62d805988fe8ebb0988a72be9c018a9b Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Sun, 10 Jun 2012 03:23:57 +0000 Subject: [PATCH] fix bvitmap font handling. woot. can use pcf's and bitmap ttf's well n ow. :) SVN revision: 71886 --- legacy/evas/ChangeLog | 8 ++++++++ legacy/evas/src/lib/canvas/evas_object_text.c | 2 +- .../src/lib/engines/common/evas_font_load.c | 18 ++++++++++++++++-- .../src/lib/engines/common/evas_font_main.c | 14 ++++++++++++-- 4 files changed, 37 insertions(+), 5 deletions(-) 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;