fix bvitmap font handling. woot. can use pcf's and bitmap ttf's well n
authorraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sun, 10 Jun 2012 03:23:57 +0000 (03:23 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sun, 10 Jun 2012 03:23:57 +0000 (03:23 +0000)
ow. :)

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@71886 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

ChangeLog
src/lib/canvas/evas_object_text.c
src/lib/engines/common/evas_font_load.c
src/lib/engines/common/evas_font_main.c

index 792e9ba..36bf224 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
        * 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.
+
index c410b71..2795f8c 100644 (file)
@@ -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, \
index 9dc3d48..4a03751 100644 (file)
@@ -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
index 94f4f77..06e0f9d 100644 (file)
@@ -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;