--- old/src/java.desktop/share/classes/java/awt/MediaTracker.java 2016-09-19 19:05:04.000000000 +0400 +++ new/src/java.desktop/share/classes/java/awt/MediaTracker.java 2016-09-19 19:05:04.000000000 +0400 @@ -29,6 +29,9 @@ 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 @@ -224,14 +227,20 @@ */ 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)); @@ -732,9 +741,9 @@ */ 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". } @@ -771,9 +780,10 @@ */ 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". } @@ -812,11 +822,14 @@ 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". } @@ -846,11 +859,9 @@ notifyAll(); } - private static Image getResolutionVariant(Image image) { - if (image instanceof MultiResolutionToolkitImage) { - return ((MultiResolutionToolkitImage) image).getResolutionVariant(); - } - return null; + private static Stream getRVItems(Image image) { + return ((MultiResolutionToolkitImage) image) + .getResolutionVariantItems().stream(); } }