--- old/src/java.desktop/share/classes/sun/java2d/SunGraphics2D.java 2016-08-24 20:28:07.000000000 +0400 +++ new/src/java.desktop/share/classes/sun/java2d/SunGraphics2D.java 2016-08-24 20:28:07.000000000 +0400 @@ -100,6 +100,7 @@ import static java.awt.geom.AffineTransform.TYPE_TRANSLATION; import java.awt.image.VolatileImage; import sun.awt.image.MultiResolutionToolkitImage; +import sun.awt.image.MultiResolutionToolkitImage.ResolutionVariantItem; import sun.awt.image.ToolkitImage; /** @@ -3130,18 +3131,22 @@ int height = img.getHeight(observer); MultiResolutionImage mrImage = (MultiResolutionImage) img; - Image resolutionVariant = getResolutionVariant(mrImage, width, height, - dx1, dy1, dx2, dy2, - sx1, sy1, sx2, sy2, - xform); + ResolutionVariantItem rvItem = getResolutionVariant(mrImage, + width, height, + dx1, dy1, dx2, dy2, + sx1, sy1, sx2, sy2, + xform); - if (resolutionVariant != img && resolutionVariant != null) { + + if (rvItem != null) { // recalculate source region for the resolution variant + Image resolutionVariant = rvItem.getImage(); ImageObserver rvObserver = MultiResolutionToolkitImage. getResolutionVariantObserver(img, observer, - width, height, -1, -1); - + rvItem.getScaleX(), + rvItem.getScaleY(), + false); int rvWidth = resolutionVariant.getWidth(rvObserver); int rvHeight = resolutionVariant.getHeight(rvObserver); @@ -3220,7 +3225,7 @@ } } - private Image getResolutionVariant(MultiResolutionImage img, + private ResolutionVariantItem getResolutionVariant(MultiResolutionImage img, int srcWidth, int srcHeight, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, AffineTransform xform) { @@ -3283,17 +3288,38 @@ destImageHeight = Math.abs(srcHeight * destRegionHeight / sh); } - Image resolutionVariant - = img.getResolutionVariant(destImageWidth, destImageHeight); + ResolutionVariantItem rvItem = getResolutionVariantItem( + img, srcWidth, srcHeight, destImageWidth, destImageHeight); + + Image resolutionVariant = rvItem.getImage(); + if (resolutionVariant == img) { + return null; + } if (resolutionVariant instanceof ToolkitImage && ((ToolkitImage) resolutionVariant).hasError()) { return null; } - return resolutionVariant; + return rvItem; } + private static ResolutionVariantItem getResolutionVariantItem( + MultiResolutionImage img, + double srcWidth, double srcHeight, + double dstWidth, double dstHeight) { + + if (img instanceof MultiResolutionToolkitImage) { + return ((MultiResolutionToolkitImage) img) + .getResolutionVariantItem(dstWidth, dstHeight); + } + + Image resolutionVariant + = img.getResolutionVariant(dstWidth, dstHeight); + double sx = resolutionVariant.getWidth(null) / srcWidth; + double sy = resolutionVariant.getWidth(null) / srcHeight; + return new ResolutionVariantItem(resolutionVariant, sx, sy); + } /** * Draws an image scaled to x,y,w,h in nonblocking mode with a * callback object.