8206238: Aspect ratio is not maintained when Image is scaled in JEditorPane

Reviewed-by: prr, sveerabhadra
This commit is contained in:
Krishna Addepalli 2018-07-12 17:34:36 +05:30
parent 1f09843a0d
commit 03d9e25265
2 changed files with 103 additions and 27 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2018, 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
@ -24,13 +24,41 @@
*/
package javax.swing.text.html;
import java.awt.*;
import java.awt.Rectangle;
import java.awt.Image;
import java.awt.Container;
import java.awt.Color;
import java.awt.Shape;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.image.ImageObserver;
import java.net.*;
import java.net.URL;
import java.net.MalformedURLException;
import java.util.Dictionary;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.event.*;
import javax.swing.GrayFilter;
import javax.swing.ImageIcon;
import javax.swing.Icon;
import javax.swing.UIManager;
import javax.swing.SwingUtilities;
import javax.swing.text.JTextComponent;
import javax.swing.text.StyledDocument;
import javax.swing.text.View;
import javax.swing.text.AttributeSet;
import javax.swing.text.Element;
import javax.swing.text.ViewFactory;
import javax.swing.text.Position;
import javax.swing.text.Segment;
import javax.swing.text.Highlighter;
import javax.swing.text.LayeredHighlighter;
import javax.swing.text.AbstractDocument;
import javax.swing.text.Document;
import javax.swing.text.BadLocationException;
import javax.swing.event.DocumentEvent;
/**
* View of an Image, intended to support the HTML <IMG> tag.
@ -744,12 +772,22 @@ public class ImageView extends View {
// anything that might cause the image to be loaded, and thus the
// ImageHandler to be called.
newWidth = getIntAttr(HTML.Attribute.WIDTH, -1);
newHeight = getIntAttr(HTML.Attribute.HEIGHT, -1);
if (newWidth > 0) {
newState |= WIDTH_FLAG;
if (newHeight <= 0) {
newHeight = newWidth;
newState |= HEIGHT_FLAG;
}
}
newHeight = getIntAttr(HTML.Attribute.HEIGHT, -1);
if (newHeight > 0) {
newState |= HEIGHT_FLAG;
if (newWidth <= 0) {
newWidth = newHeight;
newState |= WIDTH_FLAG;
}
}
if (newWidth <= 0) {

View File

@ -24,7 +24,7 @@
/**
* @test
* @key headful
* @bug 8195095
* @bug 8195095 8206238
* @summary Tests if Images are scaled correctly in JEditorPane.
* @run main ImageViewTest
*/
@ -40,22 +40,16 @@ import javax.swing.WindowConstants;
public class ImageViewTest {
private static final int WIDTH = 200;
private static final int HEIGHT = 200;
private static JFrame f;
private static JEditorPane editorPane1;
private static JEditorPane editorPane2;
private static JEditorPane editorPane3;
private static JEditorPane editorPane4;
private static void test(Robot r, JEditorPane editorPane) throws Exception {
private static void test(Robot r, JEditorPane editorPane,
final int WIDTH, final int HEIGHT ) throws Exception {
SwingUtilities.invokeAndWait(() -> {
f = new JFrame();
editorPane.setEditable(false);
f.add(editorPane);
f.setSize(220,240);
f.setSize(WIDTH + 20, HEIGHT + 40);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
@ -109,34 +103,78 @@ public class ImageViewTest {
Robot r = new Robot();
final JEditorPane[] editorPanes = new JEditorPane[11];
SwingUtilities.invokeAndWait(() -> {
editorPane1 = new JEditorPane("text/html",
editorPanes[0] = new JEditorPane("text/html",
"<img height=\"200\" src=\"file:///" + ABSOLUTE_FILE_PATH + "\"");
editorPane2 = new JEditorPane("text/html",
editorPanes[1] = new JEditorPane("text/html",
"<img width=\"200\" src=\"file:///" + ABSOLUTE_FILE_PATH + "\"");
editorPane3 = new JEditorPane("text/html",
editorPanes[2] = new JEditorPane("text/html",
"<img width=\"200\" height=\"200\" src=\"file:///" + ABSOLUTE_FILE_PATH + "\"");
editorPane4 = new JEditorPane("text/html",
editorPanes[3] = new JEditorPane("text/html",
"<img src=\"file:///" + ABSOLUTE_FILE_PATH + "\"");
editorPanes[4] = new JEditorPane("text/html",
"<img width=\"100\" src =\"file:///" + ABSOLUTE_FILE_PATH + "\"");
editorPanes[5] = new JEditorPane("text/html",
"<img height=\"100\" src =\"file:///" + ABSOLUTE_FILE_PATH + "\"");
editorPanes[6] = new JEditorPane("text/html",
"<img width=\"100\" height=\"100\" src =\"file:///" + ABSOLUTE_FILE_PATH + "\"");
editorPanes[7] = new JEditorPane("text/html",
"<img width=\"50\" src =\"file:///" + ABSOLUTE_FILE_PATH + "\"");
editorPanes[8] = new JEditorPane("text/html",
"<img height=\"50\" src =\"file:///" + ABSOLUTE_FILE_PATH + "\"");
editorPanes[9] = new JEditorPane("text/html",
"<img width=\"300\" src =\"file:///" + ABSOLUTE_FILE_PATH + "\"");
editorPanes[10] = new JEditorPane("text/html",
"<img height=\"300\" src =\"file:///" + ABSOLUTE_FILE_PATH + "\"");
});
r.waitForIdle();
System.out.println("Test with only height set to 200");
test(r, editorPane1);
test(r, editorPanes[0], 200, 200);
System.out.println("Test with only width set to 200");
test(r, editorPane2);
test(r, editorPanes[1], 200, 200);
System.out.println("Test with none of them set");
test(r, editorPane3);
System.out.println("Test with both of them set");
test(r, editorPanes[2], 200, 200);
System.out.println("Test with both of them set to 200");
test(r, editorPane4);
System.out.println("Test with none of them set to 200");
test(r, editorPanes[3], 200, 200);
System.out.println("Test with only width set to 100");
test(r, editorPanes[4], 100, 100);
System.out.println("Test with only height set to 100");
test(r, editorPanes[5], 100, 100);
System.out.println("Test with both width and height set to 100");
test(r, editorPanes[6], 100, 100);
System.out.println("Test with only width set to 50");
test(r, editorPanes[7], 50, 50);
System.out.println("Test with only height set to 50");
test(r, editorPanes[8], 50, 50);
System.out.println("Test with only width set to 300");
test(r, editorPanes[9], 300, 300);
System.out.println("Test with only height set to 300");
test(r, editorPanes[10], 300, 300);
System.out.println("Test Passed.");
}