import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.font.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class RotatedGlyphVectorBug {

    public static void main(String... args) throws Exception {

        BufferedImage img = new BufferedImage(600, 500, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = img.createGraphics();

        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setColor(Color.WHITE);
        g2d.fillRect(0, 0, img.getWidth(), img.getHeight());
        g2d.setColor(Color.BLACK);
        g2d.drawString(System.getProperty("java.version"), 10, 20);

        AffineTransform at = AffineTransform.getRotateInstance(Math.PI / 3);
        Font font = new Font(Font.SANS_SERIF, Font.PLAIN, 24);
        Font fontR = font.deriveFont(at);

        g2d.setColor(Color.blue);
        drawLaidOutGlyphVector(g2d, "GVFontRotated", 300, 50, fontR);
        drawTextLayout(g2d, "TLFontRotated", 400, 50, fontR);

        g2d.transform(at);
        g2d.setColor(Color.red);
        drawLaidOutGlyphVector(g2d, "GVG2DRotated", 200, 50, font);
        drawTextLayout(g2d, "TLG2DRotated", 200, 80, font);

        g2d.dispose();

        ImageIO.write(img, "png", new File("gv-rotation.png"));
    }

    private static void drawLaidOutGlyphVector(Graphics2D g2d,
           String s, int x, int y, Font font) {

        Font oldFont = g2d.getFont();
        g2d.setFont(font);
        GlyphVector gv;
        FontRenderContext frc = g2d.getFontRenderContext();
        char[] chs = s.toCharArray();
        gv = font.layoutGlyphVector(frc, chs, 0, chs.length, 0);
        g2d.drawGlyphVector(gv, (float)x, (float)y);
        g2d.setFont(oldFont);
    }

    private static void drawTextLayout(Graphics2D g2d,
           String s, int x, int y, Font font) {

        Font oldFont = g2d.getFont();
        g2d.setFont(font);
        FontRenderContext frc = g2d.getFontRenderContext();
        TextLayout tl = new TextLayout(s, font, frc);
        tl.draw(g2d, (float)x, (float)y);
        g2d.setFont(oldFont);
    }
}
