--- a/jdk/test/javax/swing/plaf/metal/MetalGradient/8163193/ButtonGradientTest.java Fri Jun 30 16:32:18 2017 +0200
+++ b/jdk/test/javax/swing/plaf/metal/MetalGradient/8163193/ButtonGradientTest.java Thu Jul 06 16:45:56 2017 +0530
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, 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
@@ -21,13 +21,17 @@
* questions.
*/
-import java.awt.BorderLayout;
+import java.awt.Image;
+import java.awt.Robot;
+import java.awt.Rectangle;
import java.awt.Color;
+import java.awt.Point;
+import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
-import java.awt.Rectangle;
-import java.awt.Robot;
+import java.awt.BorderLayout;
import java.awt.image.BufferedImage;
+import java.awt.image.MultiResolutionImage;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
@@ -38,18 +42,20 @@
/*
* @test
- * @bug 8163193
+ * @bug 8163193 8165213
* @key headful
* @summary Metal L&F gradient is lighter on HiDPI display
* @run main/othervm -Dsun.java2d.uiScale=2 ButtonGradientTest
*/
public class ButtonGradientTest {
-
private static JFrame frame;
private static JButton button;
+ private static List<Image> images;
+ private static Robot robot;
public static void main(String[] args) throws Exception {
try {
+ robot = new Robot();
testGradient();
} finally {
SwingUtilities.invokeAndWait(() -> {
@@ -61,11 +67,10 @@
}
private static void testGradient() throws Exception {
- Robot robot = new Robot();
- robot.setAutoDelay(50);
-
+ // Create and show the GUI
SwingUtilities.invokeAndWait(ButtonGradientTest::createAndShowGUI);
robot.waitForIdle();
+ robot.delay(500);
Rectangle rect = getButtonBounds();
List<?> gradient = (List) UIManager.get("Button.gradient");
@@ -73,11 +78,15 @@
Color c1 = (Color) gradient.get(2);
Color c2 = (Color) gradient.get(3);
int mid = (int) (ratio * rect.height);
+ // Get the expected gradient color
+ Color gradientColor = getGradientColor(rect.width, mid, c1, c2);
- Color gradientColor = getGradientColor(rect.width, mid, c1, c2);
+ // Get color from robot captured hidpi image of the button
+ getImageFromRobot();
int x = rect.x + rect.width / 2;
int y = rect.y + mid / 2;
- Color buttonColor = robot.getPixelColor(x, y);
+ Color buttonColor = new Color(((BufferedImage)(images.get(1))).getRGB(
+ (int)(x), (int)(y)));
if (!similarColors(buttonColor, gradientColor)) {
throw new RuntimeException("Button gradient is changed!");
@@ -103,6 +112,26 @@
frame.setVisible(true);
}
+ private static void getImageFromRobot() {
+ try {
+ Point butLoc = button.getLocationOnScreen();
+ Dimension butSize = button.getSize();
+ MultiResolutionImage multiResolutionImage =
+ robot.createMultiResolutionScreenCapture(
+ new Rectangle((int)butLoc.getX(),
+ (int)butLoc.getY(), (int)butSize.getWidth(),
+ (int)butSize.getHeight()));
+ images = multiResolutionImage.getResolutionVariants();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+ if(images.size() < 2) {
+ throw new RuntimeException("HiDpi Image not captured - " +
+ "Check is this HiDpi display system?");
+ }
+ }
+
private static Rectangle getButtonBounds() throws Exception {
Rectangle[] rectangles = new Rectangle[1];
SwingUtilities.invokeAndWait(() -> {
@@ -113,7 +142,8 @@
}
private static Color getGradientColor(int w, int h, Color c1, Color c2) {
- GradientPaint gradient = new GradientPaint(0, 0, c1, 0, h, c2, true);
+ GradientPaint gradient = new GradientPaint(0, 0, c1, 0, h, c2,
+ true);
BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g = img.createGraphics();
g.setPaint(gradient);
@@ -129,6 +159,6 @@
}
private static boolean similar(int i1, int i2) {
- return Math.abs(i2 - i1) < 7;
+ return Math.abs(i2 - i1) < 6;
}
-}
+}
\ No newline at end of file