8017773: OpenJDK7 returns incorrect TrueType font metrics
Reviewed-by: prr, bae
This commit is contained in:
parent
1f7d2ae35c
commit
4325c3fbec
@ -425,7 +425,6 @@ Java_sun_font_FreetypeFontScaler_getFontMetricsNative(
|
||||
jobject metrics;
|
||||
jfloat ax, ay, dx, dy, bx, by, lx, ly, mx, my;
|
||||
jfloat f0 = 0.0;
|
||||
FT_Pos bmodifier = 0;
|
||||
FTScalerContext *context =
|
||||
(FTScalerContext*) jlong_to_ptr(pScalerContext);
|
||||
FTScalerInfo *scalerInfo =
|
||||
@ -458,43 +457,38 @@ Java_sun_font_FreetypeFontScaler_getFontMetricsNative(
|
||||
So, we have to do adust them explicitly and stay consistent with what
|
||||
freetype does to outlines. */
|
||||
|
||||
/* For bolding glyphs are not just widened. Height is also changed
|
||||
(see ftsynth.c).
|
||||
|
||||
TODO: In vertical direction we could do better job and adjust metrics
|
||||
proportionally to glyoh shape. */
|
||||
if (context->doBold) {
|
||||
bmodifier = FT_MulFix(
|
||||
scalerInfo->face->units_per_EM,
|
||||
scalerInfo->face->size->metrics.y_scale)/24;
|
||||
}
|
||||
|
||||
|
||||
/**** Note: only some metrics are affected by styling ***/
|
||||
|
||||
/* See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=657854 */
|
||||
#define FT_MulFixFloatShift6(a, b) (((float) (a)) * ((float) (b)) / 65536.0 / 64.0)
|
||||
|
||||
/*
|
||||
* See FreeType source code: src/base/ftobjs.c ft_recompute_scaled_metrics()
|
||||
* http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=1659
|
||||
*/
|
||||
/* ascent */
|
||||
ax = 0;
|
||||
ay = -(jfloat) FT26Dot6ToFloat(FT_MulFix(
|
||||
((jlong) scalerInfo->face->ascender + bmodifier/2),
|
||||
ay = -(jfloat) (FT_MulFixFloatShift6(
|
||||
((jlong) scalerInfo->face->ascender),
|
||||
(jlong) scalerInfo->face->size->metrics.y_scale));
|
||||
/* descent */
|
||||
dx = 0;
|
||||
dy = -(jfloat) FT26Dot6ToFloat(FT_MulFix(
|
||||
((jlong) scalerInfo->face->descender + bmodifier/2),
|
||||
dy = -(jfloat) (FT_MulFixFloatShift6(
|
||||
((jlong) scalerInfo->face->descender),
|
||||
(jlong) scalerInfo->face->size->metrics.y_scale));
|
||||
/* baseline */
|
||||
bx = by = 0;
|
||||
|
||||
/* leading */
|
||||
lx = 0;
|
||||
ly = (jfloat) FT26Dot6ToFloat(FT_MulFix(
|
||||
(jlong) scalerInfo->face->height + bmodifier,
|
||||
ly = (jfloat) (FT_MulFixFloatShift6(
|
||||
(jlong) scalerInfo->face->height,
|
||||
(jlong) scalerInfo->face->size->metrics.y_scale))
|
||||
+ ay - dy;
|
||||
/* max advance */
|
||||
mx = (jfloat) FT26Dot6ToFloat(
|
||||
scalerInfo->face->size->metrics.max_advance +
|
||||
2*bmodifier +
|
||||
OBLIQUE_MODIFIER(scalerInfo->face->size->metrics.height));
|
||||
my = 0;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user