--- /dev/null 2018-05-22 18:47:57.000000000 +0300 +++ new/test/jdk/java/awt/font/Rotate/RotatedTextTest.java 2018-05-22 18:47:57.000000000 +0300 @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2018, 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. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test RotatedTextTest + * @bug 8203485 + * @summary This test verifies that rotated text preserves the width. + * @run main RotatedTextTest + */ + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import javax.imageio.ImageIO; + +public class RotatedTextTest +{ + static final int size = 720; + static final Font fnt = new Font("Time New Roamn", Font.PLAIN, 1).deriveFont(12.0f); + static final String text = "The quick brown fox jumps over the lazy dog"; + + static void drawRotatedText(Graphics g) { + Graphics2D g2d = (Graphics2D)g; + + g2d.setFont(fnt); + + FontMetrics metrics = g2d.getFontMetrics(); + Rectangle2D bounds = metrics.getStringBounds(text, g2d); + + + g2d.setColor(Color.black); + g2d.fillRect(0, 0, size, size); + + g2d.setColor(Color.white); + + float[] angles = new float[] { 0, 15, 45, 60, 90, -45, -90, -135, -180, 135, }; + + for (float a : angles) { + Graphics2D rotated = (Graphics2D)g2d.create(); + + rotated.translate(size/2, size/2); + rotated.rotate(Math.toRadians(a)); + rotated.translate(30, 0); + + int width_original = metrics.stringWidth(text); + int width_rotated = rotated.getFontMetrics().stringWidth(text); + + rotated.drawString(text, 0, 0); + rotated.drawString(String.format(" %.0f", a), width_original, 0); + + rotated.setColor(Color.green); + rotated.draw(bounds); + + System.out.printf("Angle: %.0f, width diff: %d\n", a, (width_rotated - width_original)); + + rotated.dispose(); + + if (width_rotated != width_original) { + throw new RuntimeException("Test failed for angle " + a); + } + } + } + + public static void main(String args[]) + { + final BufferedImage dst = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB); + Graphics g = dst.createGraphics(); + + try { + drawRotatedText(g); + } finally { + g.dispose(); + writeToFile(dst); + } + } + + static final String title; + static final String file; + + static { + String vendorName = System.getProperty("java.vendor"); + String version = System.getProperty("java.version"); + String runtimeName = System.getProperty("java.runtime.name"); + + + int index = runtimeName.indexOf(" Runtime Environment"); + runtimeName = runtimeName.substring(0, index).trim(); + + title = vendorName + ", " + runtimeName + ", " + version; + file = "rotated-text-" + title.replace(", ", "-") + .replace(" ", "-") + ".png"; + } + + private static void writeToFile(final BufferedImage bi) { + File imageFile = new File(file); + FileOutputStream imageOutStream; + BufferedOutputStream imageBOS = null; + try { + imageOutStream = new FileOutputStream(imageFile); + imageBOS = new BufferedOutputStream(imageOutStream); + + ImageIO.setUseCache(false); + ImageIO.write(bi, "png", imageBOS); + + imageBOS.close(); + imageOutStream.close(); + } + catch (Exception e) { + System.out.println(e.getMessage()); + } + } +}