Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-6683472

Incorrect handling of translation component of font transform.

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: P3 P3
    • 7
    • 6
    • client-libs
    • 2d
    • b28
    • generic
    • generic
    • Verified

        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);
            }
        }

              prr Philip Race
              prr Philip Race
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

                Created:
                Updated:
                Resolved:
                Imported:
                Indexed: