< prev index next >
src/java.desktop/share/native/libfontmanager/freetypeScaler.c
Print this page
rev 53756 : 8218854: FontMetrics.getMaxAdvance may be less than the maximum FontMetrics.charWidth
Summary: Consider algorithmic bold in FontMetrics.getMaxAdvance value and update obliqueness.
Reviewed-by: prr
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
@@ -403,14 +403,22 @@
}
return errCode;
}
-/* ftsynth.c uses (0x10000, 0x06000, 0x0, 0x10000) matrix to get oblique
- outline. Therefore x coordinate will change by 0x06000*y.
- Note that y coordinate does not change. */
-#define OBLIQUE_MODIFIER(y) (context->doItalize ? ((y)*6/16) : 0)
+/* ftsynth.c uses (0x10000, 0x0366A, 0x0, 0x10000) matrix to get oblique
+ outline. Therefore x coordinate will change by 0x0366A*y.
+ Note that y coordinate does not change. These values are based on
+ libfreetype version 2.9.1. */
+#define OBLIQUE_MODIFIER(y) (context->doItalize ? ((y)*0x366A/0x10000) : 0)
+
+/* FT_GlyphSlot_Embolden (ftsynth.c) uses FT_MulFix(units_per_EM, y_scale) / 24
+ * strength value when glyph format is FT_GLYPH_FORMAT_OUTLINE. This value has
+ * been taken from libfreetype version 2.6 and remain valid at least up to
+ * 2.9.1. */
+#define BOLD_MODIFIER(units_per_EM, y_scale) \
+ (context->doBold ? FT_MulFix(units_per_EM, y_scale) / 24 : 0)
/*
* Class: sun_font_FreetypeFontScaler
* Method: getFontMetricsNative
* Signature: (Lsun/font/Font2D;J)Lsun/font/StrikeMetrics;
@@ -493,11 +501,13 @@
(jlong) scalerInfo->face->size->metrics.y_scale))
+ ay - dy;
/* max advance */
mx = (jfloat) FT26Dot6ToFloat(
scalerInfo->face->size->metrics.max_advance +
- OBLIQUE_MODIFIER(scalerInfo->face->size->metrics.height));
+ OBLIQUE_MODIFIER(scalerInfo->face->size->metrics.height) +
+ BOLD_MODIFIER(scalerInfo->face->units_per_EM,
+ scalerInfo->face->size->metrics.y_scale));
my = 0;
metrics = (*env)->NewObject(env,
sunFontIDs.strikeMetricsClass,
sunFontIDs.strikeMetricsCtr,
< prev index next >