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

REGRESSION: Text drawn along an arc is uneven

XMLWordPrintable

    • 2d
    • rc1
    • x86
    • windows_2000



      Name: bsT130419 Date: 10/10/2001


      java version "1.4.0-beta2"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-beta2-b77)
      Java HotSpot(TM) Client VM (build 1.4.0-beta2-b77, mixed mode)

      This is a regression is known that this last worked in:
      java version "1.3.0"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0)
      Java HotSpot(TM) Client VM (build 1.3.0, mixed mode)


      The text arc formation is uneven with Java 1.4

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

      public class ArcText extends JPanel{
             String s="This is (test) circle program";
             double CharWidth[]=new double[s.length()];
             double CharDists[]=new double[s.length()];
             double TextDist=0.0D;
             double Radius=(180-48)/2D;
             double Angle;

             public ArcText(){
                    setBackground(Color.white);
                    Angle=Math.atan2(Radius,0.0D)*2D;
                    
             }
             
             public static void main(String args[]){
                    JFrame frame=new JFrame("ArcText v1.0");
                    frame.setSize(500,500);
                    frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
                    frame.addWindowListener(new WindowAdapter(){
                           public void windowClosing(WindowEvent e){
                                   System.exit(0);
                           }
                    });
                    frame.getContentPane().setLayout(new FlowLayout());
                    frame.getContentPane().add(new ArcText());
                    frame.show();
             }

             public void computeTextMetrics(){
                    Graphics2D g2d=(Graphics2D)getGraphics();
                    AffineTransform at=g2d.getTransform();
                    GlyphVector gv=getFont().createGlyphVector(new FontRenderContext(at,true,true),s);
                    for(int i=0;i<s.length();i++){
                         Rectangle2D letterRect=gv.getGlyphOutline(i).getBounds2D();
                         double w=letterRect.getWidth();
                         double a=gv.getGlyphMetrics(i).getAdvance();
                         if(w<0.0D){
                               w=a;
                         }
                         CharWidth[i]=w;
                         CharDists[i]=TextDist+w/2D;
                         TextDist+=i !=s.length()-1?a:w;
                    }
             }

             public double getCharDist(int i){
                     if(CharDists[i]==0.0D)
                          computeTextMetrics();
                     return CharDists[i];
             }

             public AffineTransform computTransform(int i){
                    double Char0=getCharDist(0);
                    double CharN=TextDist-getCharDist(s.length()-1);
                    double pos=s.length()<2?0.5D:(getCharDist(i)-Char0)/(TextDist-Char0-CharN);
                    double Char0Angle=Char0/Radius;
                    double CharNAngle=CharN/Radius;
                    double currentAngle=((Angle)*pos-Angle/2D);
                    return AffineTransform.getRotateInstance(currentAngle,0.0D,Radius);
                   
             }

             public void paintComponent(Graphics g){
                    super.paintComponent(g);
                    Graphics2D g2=(Graphics2D)g;
                    g2.setColor(Color.red);
                    g2.setFont(new Font("Times",Font.PLAIN,20));
                    RenderingHints rh=new RenderingHints(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
                    rh.put(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY);
                    g2.setRenderingHints(rh);
                    BasicStroke stroke=new BasicStroke(2.0f);
                    g2.setStroke(stroke);
                    Dimension size=getSize();
                    g2.drawOval((size.width-size.height+4)/2,2,size.height-4,size.height-4);
                    stroke=new BasicStroke(1.0f);
                    g2.setStroke(stroke);
                    g2.drawOval((size.width-size.height+8)/2,4,size.height-8,size.height-8);
                    stroke=new BasicStroke(1.5f);
                    g2.setStroke(stroke);
                    g2.drawOval((size.width-size.height+58)/2,29,size.height-58,size.height-58);
                    g2.translate(size.width/2D,(size.height-Radius*2D)/2D);
                    g2.setColor(Color.black);
                    AffineTransform baseTransform=g2.getTransform();
                    for(int i=0;i<s.length();i++){
                           g2.setTransform(baseTransform);
                           g2.transform(computTransform(i));
                           g2.translate(-CharWidth[i]/2D,0.0D);
                           g2.drawString(s.substring(i,i+1),0,0);
                    }
            }

            public Dimension getPreferredSize(){
                   return new Dimension(300,180);
            }
      }

      (Review ID: 133440)
      ======================================================================

            prr Philip Race
            bstrathesunw Bill Strathearn (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: