--- old/src/java.desktop/share/classes/sun/awt/SunToolkit.java 2016-04-05 17:09:48.000000000 +0400 +++ new/src/java.desktop/share/classes/sun/awt/SunToolkit.java 2016-04-05 17:09:48.000000000 +0400 @@ -37,7 +37,6 @@ import java.awt.image.Raster; import java.awt.peer.FramePeer; import java.awt.peer.KeyboardFocusManagerPeer; -import java.awt.peer.MouseInfoPeer; import java.awt.peer.SystemTrayPeer; import java.awt.peer.TrayIconPeer; import java.io.File; @@ -72,6 +71,9 @@ import sun.util.logging.PlatformLogger; import static java.awt.RenderingHints.*; +import java.awt.image.ResolutionVariantItem; +import java.util.Arrays; +import java.util.List; public abstract class SunToolkit extends Toolkit implements ComponentFactory, InputMethodSupport, KeyboardFocusManagerPeerProvider { @@ -747,12 +749,18 @@ @Override public Image createImage(ImageProducer producer) { - return new ToolkitImage(producer); + return (producer.isMultiResolutionImageProducer()) + ? new MultiResolutionToolkitImage(producer) + : new ToolkitImage(producer); } public static Image createImageWithResolutionVariant(Image image, - Image resolutionVariant) { - return new MultiResolutionToolkitImage(image, resolutionVariant); + Image resolutionVariant) + { + return new MultiResolutionToolkitImage(Arrays.asList( + new ResolutionVariantItem<>((ToolkitImage) image, 1, 1), + new ResolutionVariantItem<>((ToolkitImage) resolutionVariant, 2, 2) + )); } @Override @@ -768,7 +776,7 @@ } else { repbits = tkimg.getImageRep().check(o); } - return (tkimg.check(o) | repbits) & checkResolutionVariant(img, w, h, o); + return (tkimg.check(o) | repbits) & checkResolutionVariants(img, w, h, o); } @Override @@ -791,46 +799,57 @@ return false; } ImageRepresentation ir = tkimg.getImageRep(); - return ir.prepare(o) & prepareResolutionVariant(img, w, h, o); + return ir.prepare(o) & prepareResolutionVariants(img, w, h, o); } - private int checkResolutionVariant(Image img, int w, int h, ImageObserver o) { - ToolkitImage rvImage = getResolutionVariant(img); - int rvw = getRVSize(w); - int rvh = getRVSize(h); - // Ignore the resolution variant in case of error - return (rvImage == null || rvImage.hasError()) ? 0xFFFF : - checkImage(rvImage, rvw, rvh, MultiResolutionToolkitImage. - getResolutionVariantObserver( - img, o, w, h, rvw, rvh, true)); + private int checkResolutionVariants(Image img, int w, int h, ImageObserver o) { + if (!(img instanceof MultiResolutionToolkitImage)) { + return 0xFFFF; + } + + List> rvItems + = ((MultiResolutionToolkitImage) img).getResolutionVariantItems(); + + return rvItems.stream().map(rvItem -> { + double sx = rvItem.getScaleX(); + double sy = rvItem.getScaleY(); + return checkImage( + rvItem.getValue(), + getRVSize(w, sx), + getRVSize(h, sy), + MultiResolutionToolkitImage.getResolutionVariantObserver( + img, o, sx, sy, true)); + }).reduce(0xFFFF , (a, b) -> a & b); + + } - private boolean prepareResolutionVariant(Image img, int w, int h, + private boolean prepareResolutionVariants(Image img, int w, int h, ImageObserver o) { - ToolkitImage rvImage = getResolutionVariant(img); - int rvw = getRVSize(w); - int rvh = getRVSize(h); - // Ignore the resolution variant in case of error - return rvImage == null || rvImage.hasError() || prepareImage( - rvImage, rvw, rvh, - MultiResolutionToolkitImage.getResolutionVariantObserver( - img, o, w, h, rvw, rvh, true)); - } - - private static int getRVSize(int size){ - return size == -1 ? -1 : 2 * size; - } - - private static ToolkitImage getResolutionVariant(Image image) { - if (image instanceof MultiResolutionToolkitImage) { - Image resolutionVariant = ((MultiResolutionToolkitImage) image). - getResolutionVariant(); - if (resolutionVariant instanceof ToolkitImage) { - return (ToolkitImage) resolutionVariant; - } + if (!(img instanceof MultiResolutionToolkitImage)) { + return true; } - return null; + + List> rvItems + = ((MultiResolutionToolkitImage) img).getResolutionVariantItems(); + + return rvItems.stream().map(rvItem -> { + double sx = rvItem.getScaleX(); + double sy = rvItem.getScaleY(); + return prepareImage( + rvItem.getValue(), + getRVSize(w, sx), + getRVSize(h, sy), + MultiResolutionToolkitImage.getResolutionVariantObserver( + img, o, sx, sy, true)); + }).reduce(true, (a, b) -> a && b); + } + + private static int getRVSize(int size, double scale) { + return (size == -1) + ? -1 + : (scale == 1 ? size : (int) Math.round(scale * size)); } protected static boolean imageCached(String fileName) {