Hi,
JI-9016915
Regards
Philippe
On Wed, Nov 19, 2014 at 4:10 PM, Philippe Mouawad
<[email protected]
<mailto:[email protected]>> wrote:
Hello Rory,
I posted a bug, waiting for mail notification.
It seems bug appeared after Java 7 u40 as I just tested
now with Java7 u71 and it is also broken there.
I didn't test versions between 7u40 and 7u71.
Regards
Philippe
On Wed, Nov 19, 2014 at 3:44 PM, Rory O'Donnell
<[email protected]
<mailto:[email protected]>> wrote:
Hi Philippe,
Can you log a Java Incident and send us the JI number ?
Rgds,Rory
On 19/11/2014 14:36, Philippe Mouawad wrote:
Hello Rory,
For information, I submitted this question on
Swing-dev , I am not sure it
is the right list, if so hope you can help.
Regards
Philippe
---------- Forwarded message ----------
From: Philippe Mouawad
<[email protected]
<mailto:[email protected]>>
Date: Wed, Nov 19, 2014 at 3:34 PM
Subject: JAVA8u20 and JAVA8u25 Regression in
Graphics2D drawing of derived
Fonts ?
To: [email protected]
<mailto:[email protected]>
Hello,
We had recently a report of a bug on Apache JMeter:
-
https://issues.apache.org/bugzilla/show_bug.cgi?id=57221
The bug only occurs on Java 8 (u20 and u25).
We use jCharts library.
I narrowed the bug and it seems to come from the
way derived fonts are
drawn:
Library uses:
public static final AffineTransform
VERTICAL_ROTATION =
AffineTransform.getRotateInstance( -Math.PI / 2 );
Then
this.affineTransform= VERTICAL_ROTATION;
this.font.deriveFont( this.affineTransform )
So I build a stupid and ugly isolated class to
show issue, run it on Java 7
display is fine , run it on Java8 result is strange.
package org.jCharts;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.font.FontRenderContext;
import java.awt.font.LineMetrics;
import java.awt.geom.AffineTransform;
import java.awt.geom.GeneralPath;
import java.awt.geom.Rectangle2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test extends JPanel {
Rectangle2D.Float rect = new
Rectangle2D.Float(200, 200, 220, 35);
// float theta = 1.1748778437843f;
double theta = Math.PI / 6;
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
RenderingHints.VALUE_FRACTIONALMETRICS_ON);
g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,
RenderingHints.VALUE_STROKE_PURE);
g2.setPaint(Color.blue);
Font font = g2.getFont().deriveFont(18f);
g2.setFont(font);
FontRenderContext frc = g2.getFontRenderContext();
String s = "This text should be rotated";
float width = (float)
font.getStringBounds(s, frc).getWidth();
LineMetrics lm = font.getLineMetrics(s, frc);
float height = lm.getAscent() +
lm.getDescent();
// Scale text into rect.
float xScale = rect.width / width;
float yScale = rect.height / height;
float scale = (xScale > yScale) ?
yScale : xScale;
// Locate string origin.
double x = rect.x;
double y = rect.y + (rect.height +
scale * height) / 2 - scale
* lm.getDescent();
AffineTransform at =
AffineTransform.getTranslateInstance(x, y);
at.scale(scale, scale);
AffineTransform rotator = new AffineTransform();
rotator.rotate(theta, rect.getCenterX(),
rect.getCenterY());
GeneralPath rect2 = new GeneralPath(
rotator.createTransformedShape(rect));
// Draw with no rotation.
g2.draw(rect);
g2.setPaint(Color.red);
g2.setFont(font.deriveFont(at));
g2.drawString(s, 0, 0);
// Rotate once.
g2.setPaint(Color.blue);
g2.draw(rect2);
rotator.concatenate(at);
g2.setFont(font.deriveFont(rotator));
g2.setPaint(Color.red);
g2.drawString(s, 0, 0);
// Rotate again.
rotator.setToIdentity();
rotator.rotate(2 * theta, rect.getCenterX(),
rect.getCenterY());
rect2 = new
GeneralPath(rotator.createTransformedShape(rect));
g2.setPaint(Color.blue);
g2.draw(rect2);
rotator.concatenate(at);
g2.setFont(font.deriveFont(rotator));
g2.setPaint(Color.red);
g2.drawString(s, 0, 0);
// Check scaled string bounds.
// this was handled by the fractional
metrics rendering hint
}
public static void main(String[] args) {
Test test = new Test();
test.setPreferredSize(new Dimension(800, 600));
JFrame f = new JFrame();
f.getContentPane().add(test);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
}
}
Regards
Philippe M.
--
Rgds,Rory O'Donnell
Quality Engineering Manager
Oracle EMEA , Dublin, Ireland
--
Cordialement.
Philippe Mouawad.
--
Cordialement.
Philippe Mouawad.