aboutsummaryrefslogtreecommitdiff
path: root/src/share/classes/javax/swing/text/html/ImageView.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/share/classes/javax/swing/text/html/ImageView.java')
-rw-r--r--src/share/classes/javax/swing/text/html/ImageView.java76
1 files changed, 54 insertions, 22 deletions
diff --git a/src/share/classes/javax/swing/text/html/ImageView.java b/src/share/classes/javax/swing/text/html/ImageView.java
index 70fc1fb43c..427bbf181c 100644
--- a/src/share/classes/javax/swing/text/html/ImageView.java
+++ b/src/share/classes/javax/swing/text/html/ImageView.java
@@ -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
@@ -28,6 +28,7 @@ import java.awt.Rectangle;
import java.awt.Image;
import java.awt.Container;
import java.awt.Color;
+import java.awt.Dimension;
import java.awt.Shape;
import java.awt.Graphics;
import java.awt.Toolkit;
@@ -764,6 +765,20 @@ public class ImageView extends View {
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,
@@ -867,6 +882,40 @@ public class ImageView extends View {
}
}
+ 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.
@@ -931,28 +980,11 @@ public class ImageView extends View {
* specified HTML attributes.
*/
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);
- }
+ ((flags & ImageObserver.WIDTH) != 0)) {
+ Dimension d = adjustWidthHeight(newWidth, newHeight);
+ newWidth = d.width;
+ newHeight = d.height;
changed |= 3;
- }
}
synchronized(ImageView.this) {
if ((changed & 1) == 1 && (state & HEIGHT_FLAG) == 0) {