From b2c4d31401e801696dd4ef8528b3138ca39d2987 Mon Sep 17 00:00:00 2001 From: Rajeev Chamyal Date: Mon, 11 Jul 2016 14:56:17 +0530 Subject: [PATCH] 8159168: [hidpi] Window.setShape() works incorrectly on HiDPI Reviewed-by: alexsch, ssadetsky --- .../sun/awt/windows/WComponentPeer.java | 7 ++ .../java/awt/Window/8159168/SetShapeTest.java | 92 +++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 jdk/test/java/awt/Window/8159168/SetShapeTest.java diff --git a/jdk/src/java.desktop/windows/classes/sun/awt/windows/WComponentPeer.java b/jdk/src/java.desktop/windows/classes/sun/awt/windows/WComponentPeer.java index f07857b80b4..5b201f5a02e 100644 --- a/jdk/src/java.desktop/windows/classes/sun/awt/windows/WComponentPeer.java +++ b/jdk/src/java.desktop/windows/classes/sun/awt/windows/WComponentPeer.java @@ -55,6 +55,7 @@ import sun.awt.event.IgnorePaintEvent; import java.awt.dnd.DropTarget; import java.awt.dnd.peer.DropTargetPeer; +import java.awt.geom.AffineTransform; import sun.awt.AWTAccessor; import sun.util.logging.PlatformLogger; @@ -1128,6 +1129,12 @@ public abstract class WComponentPeer extends WObjectPeer } if (shape != null) { + AffineTransform tx = winGraphicsConfig.getDefaultTransform(); + double scaleX = tx.getScaleX(); + double scaleY = tx.getScaleY(); + if (scaleX != 1 || scaleY != 1) { + shape = shape.getScaledRegion(scaleX, scaleY); + } setRectangularShape(shape.getLoX(), shape.getLoY(), shape.getHiX(), shape.getHiY(), (shape.isRectangular() ? null : shape)); } else { diff --git a/jdk/test/java/awt/Window/8159168/SetShapeTest.java b/jdk/test/java/awt/Window/8159168/SetShapeTest.java new file mode 100644 index 00000000000..19670a5f46e --- /dev/null +++ b/jdk/test/java/awt/Window/8159168/SetShapeTest.java @@ -0,0 +1,92 @@ +/* +* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* This code is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License version 2 only, as +* published by the Free Software Foundation. +* +* This code is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +* version 2 for more details (a copy is included in the LICENSE file that +* accompanied this code). +* +* You should have received a copy of the GNU General Public License version +* 2 along with this work; if not, write to the Free Software Foundation, +* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +* +* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +* or visit www.oracle.com if you need additional information or have any +* questions. + */ + +/** + * @test + * @bug 8159168 + * @summary [hidpi] Window.setShape() works incorrectly on HiDPI + * @run main/othervm -Dsun.java2d.uiScale=2 SetShapeTest + */ +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Frame; +import java.awt.Panel; +import java.awt.Rectangle; +import java.awt.Window; +import java.awt.geom.Area; +import java.awt.geom.Rectangle2D; +import java.awt.Robot; +import javax.swing.SwingUtilities; + +public class SetShapeTest { + + private static Window window; + private static Frame background; + + public static void main(String[] args) throws Exception { + createUI(); + Robot robot = new Robot(); + robot.waitForIdle(); + Rectangle rect = window.getBounds(); + rect.x += rect.width - 10; + rect.y += rect.height - 10; + Color c = robot.getPixelColor(rect.x, rect.y); + try { + if (!c.equals(Color.RED)) { + throw new RuntimeException("Test Failed"); + } + } finally { + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + background.dispose(); + window.dispose(); + } + }); + } + } + + private static void createUI() throws Exception { + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + background = new Frame(); + background.setUndecorated(true); + background.setBackground(Color.blue); + background.setSize(300, 300); + background.setLocation(100, 100); + background.setVisible(true); + window = new Window(background); + window.setBackground(Color.red); + window.add(new Panel(), BorderLayout.CENTER); + window.setLocation(200, 200); + window.setSize(100, 100); + Area a = new Area(); + a.add(new Area(new Rectangle2D.Double(0, 0, 100, 100))); + window.setShape(a); + window.setVisible(true); + window.toFront(); + } + }); + } +}