< prev index next >
src/java.desktop/share/classes/java/awt/MediaTracker.java
Print this page
@@ -27,10 +27,13 @@
import java.awt.Component;
import java.awt.Image;
import java.awt.image.ImageObserver;
import sun.awt.image.MultiResolutionToolkitImage;
+import java.util.stream.Stream;
+import java.util.List;
+import sun.awt.image.MultiResolutionToolkitImage.ResolutionVariantItem;
/**
* The {@code MediaTracker} class is a utility class to track
* the status of a number of media objects. Media objects could
* include audio clips as well as images, though currently only
@@ -222,18 +225,24 @@
* @param w the width at which the image is rendered
* @param h the height at which the image is rendered
*/
public synchronized void addImage(Image image, int id, int w, int h) {
addImageImpl(image, id, w, h);
- Image rvImage = getResolutionVariant(image);
- if (rvImage != null) {
- addImageImpl(rvImage, id,
- w == -1 ? -1 : 2 * w,
- h == -1 ? -1 : 2 * h);
+
+ if (image instanceof MultiResolutionToolkitImage) {
+ getRVItems(image).forEach(rvItem ->
+ addImageImpl(rvItem.getImage(), id,
+ scale(w, rvItem.getScaleX()),
+ scale(h, rvItem.getScaleY())
+ ));
}
}
+ private static int scale(int size, double scale) {
+ return (size == -1 || scale == 1) ? size : (int) Math.ceil(scale * size);
+ }
+
private void addImageImpl(Image image, int id, int w, int h) {
head = MediaEntry.insert(head,
new ImageMediaEntry(this, image, id, w, h));
}
/**
@@ -730,13 +739,13 @@
* @see java.awt.MediaTracker#removeImage(java.awt.Image, int, int, int)
* @since 1.1
*/
public synchronized void removeImage(Image image) {
removeImageImpl(image);
- Image rvImage = getResolutionVariant(image);
- if (rvImage != null) {
- removeImageImpl(rvImage);
+ if (image instanceof MultiResolutionToolkitImage) {
+ getRVItems(image).forEach(rvItem ->
+ removeImageImpl(rvItem.getImage()));
}
notifyAll(); // Notify in case remaining images are "done".
}
private void removeImageImpl(Image image) {
@@ -769,13 +778,14 @@
* @see java.awt.MediaTracker#removeImage(java.awt.Image, int, int, int)
* @since 1.1
*/
public synchronized void removeImage(Image image, int id) {
removeImageImpl(image, id);
- Image rvImage = getResolutionVariant(image);
- if (rvImage != null) {
- removeImageImpl(rvImage, id);
+
+ if (image instanceof MultiResolutionToolkitImage) {
+ getRVItems(image).forEach(rvItem ->
+ removeImageImpl(rvItem.getImage(), id));
}
notifyAll(); // Notify in case remaining images are "done".
}
private void removeImageImpl(Image image, int id) {
@@ -810,15 +820,18 @@
* @since 1.1
*/
public synchronized void removeImage(Image image, int id,
int width, int height) {
removeImageImpl(image, id, width, height);
- Image rvImage = getResolutionVariant(image);
- if (rvImage != null) {
- removeImageImpl(rvImage, id,
- width == -1 ? -1 : 2 * width,
- height == -1 ? -1 : 2 * height);
+
+ if (image instanceof MultiResolutionToolkitImage) {
+
+ getRVItems(image).forEach(rvItem ->
+ removeImageImpl(rvItem.getImage(), id,
+ scale(width, rvItem.getScaleX()),
+ scale(height, rvItem.getScaleY())
+ ));
}
notifyAll(); // Notify in case remaining images are "done".
}
private void removeImageImpl(Image image, int id, int width, int height) {
@@ -844,15 +857,13 @@
synchronized void setDone() {
notifyAll();
}
- private static Image getResolutionVariant(Image image) {
- if (image instanceof MultiResolutionToolkitImage) {
- return ((MultiResolutionToolkitImage) image).getResolutionVariant();
- }
- return null;
+ private static Stream<ResolutionVariantItem> getRVItems(Image image) {
+ return ((MultiResolutionToolkitImage) image)
+ .getResolutionVariantItems().stream();
}
}
abstract class MediaEntry {
MediaTracker tracker;
< prev index next >