8218674: HTML Tooltip with "img=src" on component doesn't show
Reviewed-by: serb, psadhukhan
--- 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