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;
}
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;
}
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;
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;
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;
}
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;
}
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;
((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 */