United StatesChange Country, Oracle Worldwide Web Sites Communities I am a... I want to...
Bug ID: 6683472 Incorrect handling of translation component of font transform.
6683472 : Incorrect handling of translation component of font transform.

Details
Type:
Bug
Submit Date:
2008-04-02
Status:
Closed
Updated Date:
2011-03-07
Project Name:
JDK
Resolved Date:
2011-03-07
Component:
client-libs
OS:
generic
Sub-Component:
2d
CPU:
generic
Priority:
P3
Resolution:
Fixed
Affected Versions:
6
Fixed Versions:
7

Related Reports
Backport:
Backport:
Relates:

Sub Tasks

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.
                                     
2008-04-02



Hardware and Software, Engineered to Work Together