Hello, Thanks for fast answer and workaround although as it's a third party library it will be a problem. I tested workaround it is not enough as with it test is moved from its location.
Another point, looking at: https://bugs.openjdk.java.net/browse/JDK-8031109 I don't see any progress on it , any chance it gets fixed ? I tested on Java 9, it is still there. As there is a comment saying this, I am someone who is reporting it :-) : *Nevertheless if someone have a report against 9 - please reopen and add affectedVersion 9 or 7u specific escalations might be reopen to Sustaining * Regards Philippe On Wed, Nov 19, 2014 at 7:02 PM, Balchandra Vaidya < [email protected]> wrote: > > Hi Philippe, > > > Thanks for the update. Sergey Bylokhov provided a following > workaround in the bug JDK-8065373 > <https://bugs.openjdk.java.net/browse/JDK-8065373>. > > Workaround is to apply a transfrom to the graphics instead of font: > + g2.transform(rotator); > - g2.setFont(font.deriveFont(rotator)); > > > He has also provided a suggested fix. A blog [1] from Dalibor > might help you to track the JBS bug yourself. > > > > Thanks > Balchandra > > [1] http://robilad.livejournal.com/139637.html > > > > > > On 11/19/14 04:58 PM, Philippe Mouawad wrote: > > Hi, > I tested on windows 7 , issue is not reproduced. > Don't have Linux to test. > > Maybe other member of team can do this. > > Regards > > On Wed, Nov 19, 2014 at 4:45 PM, Balchandra Vaidya < > [email protected]> wrote: > >> >> Hi Philippe, >> >> Here is the JBS ID - https://bugs.openjdk.java.net/browse/JDK-8065373. >> Did you see this issue only on Mac OS or did you see it on another >> OS/platform such as Windows? >> >> Thanks for reporting it. >> >> Regards, >> Balchandra >> >> >> >> >> On 11/19/14 03:11 PM, Philippe Mouawad wrote: >> >> Hi, >> JI-9016915 Regards >> Philippe >> >> On Wed, Nov 19, 2014 at 4:10 PM, Philippe Mouawad < >> [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]> 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]> >>>>> Date: Wed, Nov 19, 2014 at 3:34 PM >>>>> Subject: JAVA8u20 and JAVA8u25 Regression in Graphics2D drawing of >>>>> derived >>>>> Fonts ? >>>>> To: [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. >> >> >> >> > > > -- > Cordialement. > Philippe Mouawad. > > > > -- Cordialement. Philippe Mouawad.
