-
Bug
-
Resolution: Fixed
-
P4
-
1.4.0
-
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)
======================================================================