Mercurial > hg > openjdk > jdk8u > jdk
changeset 13529:78d1f9f2fec2 jdk8u222-b02
8218674: HTML Tooltip with "img=src" on component doesn't show
Summary: Make sure image is scaled appropriately if synchronous loading flag is set.
Reviewed-by: serb, psadhukhan
author | kaddepalli |
---|---|
date | Thu, 09 May 2019 21:02:50 +0000 |
parents | 3f75ecf2feed |
children | 43f4f5b4becc cac1aa619936 |
files | src/share/classes/javax/swing/text/html/ImageView.java test/javax/swing/text/html/8218674/TooltipImageTest.java test/javax/swing/text/html/8218674/circle.png |
diffstat | 3 files changed, 128 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/javax/swing/text/html/ImageView.java Thu Apr 25 15:19:52 2019 +0200 +++ b/src/share/classes/javax/swing/text/html/ImageView.java Thu May 09 21:02:50 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, 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 @@ -734,6 +734,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, @@ -837,6 +851,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. @@ -902,26 +950,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/javax/swing/text/html/8218674/TooltipImageTest.java Thu May 09 21:02:50 2019 +0000 @@ -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."); + } +}