Webrev: http://cr.openjdk.java.net/~bae/8203485/webrev.00/ Bug: https://bugs.openjdk.java.net/browse/JDK-8203485
With freetype, text rotated on 180 or 270 degrees is too narrow. Attached test case and screenshots demonstrate the problem. The problem is caused by the rounding applied to the cases of vertical and horizontal text, see freetypeScaler.c, lines 768 and 773: http://hg.openjdk.java.net/jdk/client/file/80a5ff734fcd/src/java.desktop/share/native/libfontmanager/freetypeScaler.c#l768 http://hg.openjdk.java.net/jdk/client/file/80a5ff734fcd/src/java.desktop/share/native/libfontmanager/freetypeScaler.c#l773 The rounding routine is defined as ROUND(x) ((int) (x+0.5)) (see line 48), and it gives incorrect results for negative arguments. For example, say glyph advance is 8, and we render it without rotation, and with rotation on 180 degrees. In these cases, we get ROUND(8) = 8, whereas for 180 degrees we get ROUND(-8) = -7. This rounding error leads to decrease of the width of the rendered text. For the case of integer metrics, we can expect that FT26.6 advances produced by freetype are integer, i.e. fractional part (lower 6 bits) is zero. So, we can convert them to glyph info values without floating point division, just by using integer shift. In this case, there is no need to round the floating point value to integer, and there is no need to care about sign of the argument. Thanks, Andrew