JDK-6683472 : Incorrect handling of translation component of font transform.
  • Type: Bug
  • Component: client-libs
  • Sub-Component: 2d
  • Affected Version: 6
  • Priority: P3
  • Status: Closed
  • Resolution: Fixed
  • OS: generic
  • CPU: generic
  • Submitted: 2008-04-02
  • Updated: 2011-03-07
  • Resolved: 2011-03-07
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 6 JDK 7 Other
6u10Fixed 7 b28Fixed OpenJDK6Fixed
Related Reports
Relates :  
Description
The program below shows that when a font has a transformation such
that it includes a rotation and translation component, that TextLayout
and drawString disagree on the rendering location for that text.

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
import java.util.HashMap;
import java.awt.font.*;
import java.awt.event.*;

public class txbug extends Component {

    public Dimension getPreferredSize() {
            return new Dimension(500, 300);
    }
    
    public void paint(Graphics g) {

        Graphics2D g2d = (Graphics2D)g;
        int x=130, y=130;

        String s = "Text";
        Font fnt = new Font("SansSerif", Font.PLAIN, 60);
        g.setFont(fnt);

        int xt=50, yt=90;
        AffineTransform aff = AffineTransform.getTranslateInstance(xt, yt);
        aff.rotate(90.0 * Math.PI/180.0);

        g.drawLine(x+xt-10, y+yt-10, x+xt+10, y+yt+10);
        g.drawLine(x+xt+10, y+yt-10, x+xt-10, y+yt+10);

        fnt = fnt.deriveFont(Font.PLAIN, aff);
        g.setFont(fnt);
        g.setColor(Color.blue);
        g.drawString(s, x, y);
        
        g.setColor(Color.red);
        FontRenderContext frc = g2d.getFontRenderContext();
        HashMap attrMap = new HashMap();
        attrMap.put(TextAttribute.STRIKETHROUGH,
                    TextAttribute.STRIKETHROUGH_ON);
        fnt = fnt.deriveFont(attrMap);
        TextLayout tl = new TextLayout(s, fnt, frc);
        tl.draw(g2d, (float)x, (float)y);
    }
	
    public static void main(String[] args) {
        
        JFrame f = new JFrame("Rotated font with translation");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        
        f.getContentPane().add(new txbug());
        f.setSize(600, 400);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}

Comments
EVALUATION drawString is handling this by translating the rendering position. TextLayout, because it handles multiple runs of text, tries to be compatible, but is incorrectly extracting the translation.
02-04-2008