# HG changeset patch # User aghaisas # Date 1499339756 -19800 # Node ID ebee0056e4eab5b606d97f3b03df6101f8cb6a9d # Parent 857d25fae728d7a26c7740514c4ec3bb21c7526b 8165213: [TESTBUG] [PIT] consistent failure of a new regtest for 8163193 Reviewed-by: psadhukhan, serb Contributed-by: shashidhara.veerabhadraiah@oracle.com diff -r 857d25fae728 -r ebee0056e4ea jdk/test/javax/swing/plaf/metal/MetalGradient/8163193/ButtonGradientTest.java --- 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