Return-Path: X-Original-To: apmail-jmeter-dev-archive@minotaur.apache.org Delivered-To: apmail-jmeter-dev-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id B0512101F2 for ; Wed, 19 Nov 2014 22:06:16 +0000 (UTC) Received: (qmail 74153 invoked by uid 500); 19 Nov 2014 22:06:16 -0000 Delivered-To: apmail-jmeter-dev-archive@jmeter.apache.org Received: (qmail 74122 invoked by uid 500); 19 Nov 2014 22:06:16 -0000 Mailing-List: contact dev-help@jmeter.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@jmeter.apache.org Delivered-To: mailing list dev@jmeter.apache.org Received: (qmail 74096 invoked by uid 99); 19 Nov 2014 22:06:16 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 19 Nov 2014 22:06:16 +0000 X-ASF-Spam-Status: No, hits=-0.0 required=5.0 tests=SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: local policy) Received: from [81.169.162.220] (HELO h1611079.stratoserver.net) (81.169.162.220) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 19 Nov 2014 22:06:11 +0000 Received: from [192.168.178.43] (dslb-094-221-122-109.094.221.pools.vodafone-ip.de [94.221.122.109]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by h1611079.stratoserver.net (Postfix) with ESMTPSA id CB0A749481C4; Wed, 19 Nov 2014 23:05:38 +0100 (CET) Message-ID: <546D1430.6020807@internetallee.de> Date: Wed, 19 Nov 2014 23:05:36 +0100 From: Felix Schumacher User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.2.0 MIME-Version: 1.0 To: dev@jmeter.apache.org, Balchandra Vaidya CC: rory.odonnell@oracle.com, Dalibor Topic Subject: Re: Fwd: JAVA8u20 and JAVA8u25 Regression in Graphics2D drawing of derived Fonts ? References: <546CACBE.7010900@oracle.com> <546CBB1A.3050907@oracle.com> In-Reply-To: Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Virus-Checked: Checked by ClamAV on apache.org Am 19.11.2014 um 17:58 schrieb Philippe Mouawad: > Hi, > I tested on windows 7 , issue is not reproduced. > Don't have Linux to test. > > Maybe other member of team can do this. Looks good on (well, I can read all text and none is mirrored). ubuntu 14.04 and java version "1.8.0_25" Java(TM) SE Runtime Environment (build 1.8.0_25-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode) and java version "1.7.0_65" OpenJDK Runtime Environment (IcedTea 2.5.3) (7u71-2.5.3-0ubuntu0.14.04.1) OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode) Regards Felix > > Regards > > On Wed, Nov 19, 2014 at 4:45 PM, Balchandra Vaidya < > balchandra.vaidya@oracle.com> 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 < >> philippe.mouawad@gmail.com> 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 >>> 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 >>>>> Date: Wed, Nov 19, 2014 at 3:34 PM >>>>> Subject: JAVA8u20 and JAVA8u25 Regression in Graphics2D drawing of >>>>> derived >>>>> Fonts ? >>>>> To: swing-dev@openjdk.java.net >>>>> >>>>> >>>>> 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. >> >> >> >> >