8132123: MultiResolutionCachedImage unnecessarily creates base image to get its size
authoralexsch
Thu, 30 Jul 2015 12:40:45 +0400
changeset 32125 008f0a0d17e0
parent 32124 f5ee581efbb7
child 32126 6611b32dfa58
8132123: MultiResolutionCachedImage unnecessarily creates base image to get its size Reviewed-by: serb
jdk/src/java.desktop/share/classes/sun/awt/image/MultiResolutionCachedImage.java
jdk/test/java/awt/image/multiresolution/MultiResolutionCachedImageTest.java
jdk/test/javax/swing/JSplitPane/8132123/bug8132123.html
jdk/test/javax/swing/JSplitPane/8132123/bug8132123.java
--- a/jdk/src/java.desktop/share/classes/sun/awt/image/MultiResolutionCachedImage.java	Thu Jul 30 12:31:20 2015 +0400
+++ b/jdk/src/java.desktop/share/classes/sun/awt/image/MultiResolutionCachedImage.java	Thu Jul 30 12:40:45 2015 +0400
@@ -86,19 +86,24 @@
     @Override
     public int getWidth(ImageObserver observer) {
         updateInfo(observer, ImageObserver.WIDTH);
-        return super.getWidth(observer);
+        return baseImageWidth;
     }
 
     @Override
     public int getHeight(ImageObserver observer) {
         updateInfo(observer, ImageObserver.HEIGHT);
-        return super.getHeight(observer);
+        return baseImageHeight;
     }
 
     @Override
     public Object getProperty(String name, ImageObserver observer) {
         updateInfo(observer, ImageObserver.PROPERTIES);
-        return super.getProperty(name, observer);
+        return Image.UndefinedProperty;
+    }
+
+    @Override
+    public Image getScaledInstance(int width, int height, int hints) {
+        return getResolutionVariant(width, height);
     }
 
     @Override
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/image/multiresolution/MultiResolutionCachedImageTest.java	Thu Jul 30 12:40:45 2015 +0400
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2015, 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.
+ */
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Image;
+import java.awt.geom.Dimension2D;
+import java.awt.image.BufferedImage;
+import sun.awt.image.MultiResolutionCachedImage;
+
+/**
+ * @test
+ * @bug 8132123
+ * @author Alexander Scherbatiy
+ * @summary MultiResolutionCachedImage unnecessarily creates base image to get
+ *          its size
+ * @modules java.desktop/sun.awt.image
+ * @run main MultiResolutionCachedImageTest
+ */
+public class MultiResolutionCachedImageTest {
+
+    private static final Color TEST_COLOR = Color.BLUE;
+
+    public static void main(String[] args) {
+
+        Image image = new TestMultiResolutionCachedImage(100);
+
+        image.getWidth(null);
+        image.getHeight(null);
+        image.getProperty("comment", null);
+
+        int scaledSize = 50;
+        Image scaledImage = image.getScaledInstance(scaledSize, scaledSize,
+                Image.SCALE_SMOOTH);
+
+        if (!(scaledImage instanceof BufferedImage)) {
+            throw new RuntimeException("Wrong scaled image!");
+        }
+
+        BufferedImage buffScaledImage = (BufferedImage) scaledImage;
+
+        if (buffScaledImage.getWidth() != scaledSize
+                || buffScaledImage.getHeight() != scaledSize) {
+            throw new RuntimeException("Wrong scaled image!");
+        }
+
+        if (buffScaledImage.getRGB(scaledSize / 2, scaledSize / 2) != TEST_COLOR.getRGB()) {
+            throw new RuntimeException("Wrong scaled image!");
+        }
+    }
+
+    private static Dimension2D getDimension(int size) {
+        return new Dimension(size, size);
+    }
+
+    private static Dimension2D[] getSizes(int size) {
+        return new Dimension2D[]{getDimension(size), getDimension(2 * size)};
+    }
+
+    private static Image createImage(int width, int height) {
+        BufferedImage buffImage = new BufferedImage(width, height,
+                BufferedImage.TYPE_INT_RGB);
+        Graphics g = buffImage.createGraphics();
+        g.setColor(TEST_COLOR);
+        g.fillRect(0, 0, width, height);
+        return buffImage;
+    }
+
+    private static class TestMultiResolutionCachedImage
+            extends MultiResolutionCachedImage {
+
+        private final int size;
+
+        public TestMultiResolutionCachedImage(int size) {
+            super(size, size, getSizes(size), (w, h) -> createImage(w, h));
+            this.size = size;
+        }
+
+        @Override
+        public Image getResolutionVariant(int width, int height) {
+            if (width == size || height == size) {
+                throw new RuntimeException("Base image is requested!");
+            }
+            return super.getResolutionVariant(width, height);
+        }
+
+        @Override
+        protected Image getBaseImage() {
+            throw new RuntimeException("Base image is used");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JSplitPane/8132123/bug8132123.html	Thu Jul 30 12:40:45 2015 +0400
@@ -0,0 +1,38 @@
+<!--
+ Copyright (c) 2015, 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.
+-->
+
+<html>
+<body>
+Verify that JSplitPane uses high-resolution system icons for the one-touch expanding
+buttons on HiDPI displays.
+
+If the display does not support HiDPI mode press PASS.
+
+1. Run the test on HiDPI Display.
+2. Check that the one-touch expanding buttons on the JSplitPane are painted
+correctly. If so, press PASS, else press FAIL.
+
+<applet  code="bug8132123.class" width=250 height=250></applet>
+
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JSplitPane/8132123/bug8132123.java	Thu Jul 30 12:40:45 2015 +0400
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2015, 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.
+ */
+import java.awt.Color;
+import javax.swing.JApplet;
+import javax.swing.JPanel;
+import javax.swing.JSplitPane;
+import javax.swing.SwingUtilities;
+
+/* @test
+ * @bug 8132123
+ * @summary MultiResolutionCachedImage unnecessarily creates base image
+ *           to get its size
+ * @author Alexander Scherbatiy
+ * @run applet/manual=yesno bug8132123.html
+ */
+public class bug8132123 extends JApplet {
+
+    @Override
+    public void init() {
+        SwingUtilities.invokeLater(() -> {
+            JPanel left = new JPanel();
+            left.setBackground(Color.GRAY);
+            JPanel right = new JPanel();
+            right.setBackground(Color.GRAY);
+            JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
+                    left, right);
+            splitPane.setOneTouchExpandable(true);
+            getContentPane().add(splitPane);
+        });
+    }
+}