8218674: HTML Tooltip with "img=src" on component doesn't show
authorkaddepalli
Thu, 07 Mar 2019 12:51:02 +0530
changeset 54236 a5af6175d62b
parent 54235 63946f20c24f
child 54237 7d5e595cb7aa
8218674: HTML Tooltip with "img=src" on component doesn't show Reviewed-by: serb, psadhukhan
src/java.desktop/share/classes/javax/swing/text/html/ImageView.java
test/jdk/javax/swing/text/html/8218674/TooltipImageTest.java
test/jdk/javax/swing/text/html/8218674/circle.png
--- a/src/java.desktop/share/classes/javax/swing/text/html/ImageView.java	Tue Mar 05 14:03:21 2019 +0530
+++ b/src/java.desktop/share/classes/javax/swing/text/html/ImageView.java	Thu Mar 07 12:51:02 2019 +0530
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2019, 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
@@ -26,6 +26,7 @@
 
 import java.awt.Rectangle;
 import java.awt.Image;
+import java.awt.Dimension;
 import java.awt.Container;
 import java.awt.Color;
 import java.awt.Shape;
@@ -782,6 +783,20 @@
                 newState |= HEIGHT_FLAG;
             }
 
+            /*
+            If synchronous loading flag is set, then make sure that the image is
+            scaled appropriately.
+            Otherwise, the ImageHandler::imageUpdate takes care of scaling the image
+            appropriately.
+            */
+            if (getLoadsSynchronously()) {
+                Dimension d = adjustWidthHeight(image.getWidth(imageObserver),
+                                                image.getHeight(imageObserver));
+                newWidth = d.width;
+                newHeight = d.height;
+                newState |= (WIDTH_FLAG | HEIGHT_FLAG);
+            }
+
             // Make sure the image starts loading:
             if ((newState & (WIDTH_FLAG | HEIGHT_FLAG)) != 0) {
                 Toolkit.getDefaultToolkit().prepareImage(newImage, newWidth,
@@ -885,6 +900,40 @@
         }
     }
 
+    private Dimension adjustWidthHeight(int newWidth, int newHeight) {
+        Dimension d = new Dimension();
+        double proportion = 0.0;
+        final int specifiedWidth = getIntAttr(HTML.Attribute.WIDTH, -1);
+        final int specifiedHeight = getIntAttr(HTML.Attribute.HEIGHT, -1);
+        /**
+         * If either of the attributes are not specified, then calculate the
+         * proportion for the specified dimension wrt actual value, and then
+         * apply the same proportion to the unspecified dimension as well,
+         * so that the aspect ratio of the image is maintained.
+         */
+        if (specifiedWidth != -1 && specifiedHeight != -1) {
+            newWidth = specifiedWidth;
+            newHeight = specifiedHeight;
+        } else if (specifiedWidth != -1 ^ specifiedHeight != -1) {
+            if (specifiedWidth <= 0) {
+                proportion = specifiedHeight / ((double)newHeight);
+                newWidth = (int)(proportion * newWidth);
+                newHeight = specifiedHeight;
+            }
+
+            if (specifiedHeight <= 0) {
+                proportion = specifiedWidth / ((double)newWidth);
+                newHeight = (int)(proportion * newHeight);
+                newWidth = specifiedWidth;
+            }
+        }
+
+        d.width = newWidth;
+        d.height = newHeight;
+
+        return d;
+    }
+
     /**
      * ImageHandler implements the ImageObserver to correctly update the
      * display as new parts of the image become available.
@@ -950,27 +999,10 @@
                  */
                 if (((flags & ImageObserver.HEIGHT) != 0) &&
                     ((flags & ImageObserver.WIDTH) != 0)) {
-                    double proportion = 0.0;
-                    final int specifiedWidth = getIntAttr(HTML.Attribute.WIDTH, -1);
-                    final int specifiedHeight = getIntAttr(HTML.Attribute.HEIGHT, -1);
-                    /**
-                     * If either of the attributes are not specified, then calculate the
-                     * proportion for the specified dimension wrt actual value, and then
-                     * apply the same proportion to the unspecified dimension as well,
-                     * so that the aspect ratio of the image is maintained.
-                     */
-                    if (specifiedWidth != -1 ^ specifiedHeight != -1) {
-                        if (specifiedWidth <= 0) {
-                            proportion = specifiedHeight / ((double)newHeight);
-                            newWidth = (int)(proportion * newWidth);
-                        }
-
-                        if (specifiedHeight <= 0) {
-                            proportion = specifiedWidth / ((double)newWidth);
-                            newHeight = (int)(proportion * newHeight);
-                        }
+                        Dimension d = adjustWidthHeight(newWidth, newHeight);
+                        newWidth = d.width;
+                        newHeight = d.height;
                         changed |= 3;
-                    }
                 }
                 synchronized(ImageView.this) {
                     if ((changed & 1) == 1 && (state & HEIGHT_FLAG) == 0) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/javax/swing/text/html/8218674/TooltipImageTest.java	Thu Mar 07 12:51:02 2019 +0530
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2019, 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
+ * @key headful
+ * @bug 8218674
+ * @summary Tests if Images are rendered and scaled correctly in JToolTip.
+ * @run main TooltipImageTest
+ */
+import java.awt.Dimension;
+import java.awt.Insets;
+import javax.swing.JToolTip;
+import javax.swing.SwingUtilities;
+
+public class TooltipImageTest {
+
+    private static void checkSize(JToolTip tip, int width, int height) {
+        Dimension d = tip.getPreferredSize();
+        Insets insets = tip.getInsets();
+        //6 seems to be the extra width being allocated for some reason
+        //for a tooltip window.
+        if (!((d.width - insets.right - insets.left - 6) == width) &&
+            !((d.height - insets.top - insets.bottom) == height)) {
+            throw new RuntimeException("Test case fails: Expected width, height is " + width + ", " + height +
+                    " whereas actual width, height are " + (d.width - insets.right - insets.left - 6) + " " +
+                    (d.height - insets.top - insets.bottom));
+        }
+     }
+
+    public static void main(String[] args) throws Exception {
+        String PATH = TooltipImageTest.class.getResource("circle.png").getPath();
+        SwingUtilities.invokeAndWait(() -> {
+            JToolTip tip = new JToolTip();
+            tip.setTipText("<html><img width=\"100\" src=\"file:///" + PATH + "\"></html>");
+            checkSize(tip, 100, 100);
+
+            tip.setTipText("<html><img height=\"100\" src=\"file:///" + PATH + "\"></html>");
+            checkSize(tip, 100, 100);
+
+            tip.setTipText("<html><img src=\"file:///" + PATH + "\"></html>");
+            checkSize(tip, 200, 200);
+
+            tip.setTipText("<html><img width=\"50\" src=\"file:///" + PATH + "\"></html>");
+            checkSize(tip, 50, 50);
+
+            tip.setTipText("<html><img height=\"50\" src=\"file:///" + PATH + "\"></html>");
+            checkSize(tip, 50, 50);
+
+            tip.setTipText("<html><img width=\"100\" height=\"50\" src=\"file:///" + PATH + "\"></html>");
+            checkSize(tip, 100, 50);
+        });
+
+        System.out.println("Test case passed.");
+    }
+}
Binary file test/jdk/javax/swing/text/html/8218674/circle.png has changed