--- old/src/macosx/classes/com/apple/laf/AquaPainter.java 2014-03-26 16:01:15.000000000 +0400 +++ new/src/macosx/classes/com/apple/laf/AquaPainter.java 2014-03-26 16:01:13.000000000 +0400 @@ -148,34 +148,48 @@ return; } - int scale = 1; - if (g instanceof SunGraphics2D) { - scale = ((SunGraphics2D) g).surfaceData.getDefaultScale(); - } final GraphicsConfiguration config = g.getDeviceConfiguration(); final ImageCache cache = ImageCache.getInstance(); - final int imgW = bounds.width * scale; - final int imgH = bounds.height * scale; + final int width = bounds.width; + final int height = bounds.height; AquaPixelsKey key = new AquaPixelsKey(config, - imgW, imgH, scale, controlState); - BufferedImage img = (BufferedImage) cache.getImage(key); + width, height, bounds, controlState); + Image img = (BufferedImage) cache.getImage(key); if (img == null) { - img = new BufferedImage(imgW, imgH, BufferedImage.TYPE_INT_ARGB_PRE); + + Dimension[] sizes = new Dimension[]{ + new Dimension(width, height), new Dimension(2 * width, 2 * height) + }; + + Image baseImage = createImage(width, height, bounds, control, + controlState); + + img = new MultiResolutionBufferedImage(baseImage, sizes, + (rvWidth, rvHeight) -> createImage(rvWidth, rvHeight, + bounds, control, controlState)); + if (!controlState.is(JRSUIConstants.Animating.YES)) { cache.setImage(key, img); } - - final WritableRaster raster = img.getRaster(); - final DataBufferInt buffer = (DataBufferInt) raster.getDataBuffer(); - - control.set(controlState); - control.paint(SunWritableRaster.stealData(buffer, 0), - imgW, imgH, 0, 0, bounds.width, bounds.height); - SunWritableRaster.markDirty(buffer); } g.drawImage(img, bounds.x, bounds.y, bounds.width, bounds.height, null); } + + private static Image createImage(int imgW, int imgH, final Rectangle bounds, + final JRSUIControl control, JRSUIState controlState) { + BufferedImage img = new BufferedImage(imgW, imgH, + BufferedImage.TYPE_INT_ARGB_PRE); + + final WritableRaster raster = img.getRaster(); + final DataBufferInt buffer = (DataBufferInt) raster.getDataBuffer(); + + control.set(controlState); + control.paint(SunWritableRaster.stealData(buffer, 0), + imgW, imgH, 0, 0, bounds.width, bounds.height); + SunWritableRaster.markDirty(buffer); + return img; + } } private static class AquaPixelsKey implements ImageCache.PixelsKey { @@ -187,17 +201,17 @@ private final GraphicsConfiguration config; private final int w; private final int h; - private final int scale; + private final Rectangle bounds; private final JRSUIState state; AquaPixelsKey(final GraphicsConfiguration config, - final int w, final int h, final int scale, + final int w, final int h, final Rectangle bounds, final JRSUIState state) { this.pixelCount = w * h; this.config = config; this.w = w; this.h = h; - this.scale = scale; + this.bounds = bounds; this.state = state; this.hash = hash(); } @@ -210,7 +224,7 @@ int hash = config != null ? config.hashCode() : 0; hash = 31 * hash + w; hash = 31 * hash + h; - hash = 31 * hash + scale; + hash = 31 * hash + bounds.hashCode(); hash = 31 * hash + state.hashCode(); return hash; } @@ -225,7 +239,7 @@ if (obj instanceof AquaPixelsKey) { AquaPixelsKey key = (AquaPixelsKey) obj; return config == key.config && w == key.w && h == key.h - && scale == key.scale && state.equals(key.state); + && bounds.equals(key.bounds) && state.equals(key.state); } return false; }