fix font rounding in evas to round and not floor - fixes some rare
authorCarsten Haitzler <raster@rasterman.com>
Wed, 10 Oct 2012 06:07:38 +0000 (06:07 +0000)
committerCarsten Haitzler <raster@rasterman.com>
Wed, 10 Oct 2012 06:07:38 +0000 (06:07 +0000)
font sizing issues.

SVN revision: 77688

legacy/evas/ChangeLog
legacy/evas/NEWS
legacy/evas/src/lib/engines/common/evas_font_load.c
legacy/evas/src/lib/engines/common/evas_font_main.c
legacy/evas/src/lib/engines/common/evas_font_private.h

index 8ee08f9..83c9976 100644 (file)
        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.
+
index e06cfe7..b0ac447 100644 (file)
@@ -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.
index 33126ad..11b46f9 100644 (file)
@@ -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;
      }
index ecbe263..1154bd7 100644 (file)
@@ -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;
index 2a2a382..c50cbb0 100644 (file)
@@ -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 */