From 58cb76db60720905eab603004b71962b16092a16 Mon Sep 17 00:00:00 2001 From: alexsch Date: Thu, 10 Apr 2014 14:33:24 +0400 Subject: 8032667: [macosx] Components cannot be rendered in HiDPI to BufferedImage Reviewed-by: serb, pchelko --- src/macosx/classes/com/apple/laf/AquaPainter.java | 54 ++++++++++++++--------- 1 file changed, 32 insertions(+), 22 deletions(-) (limited to 'src/macosx/classes/com/apple') diff --git a/src/macosx/classes/com/apple/laf/AquaPainter.java b/src/macosx/classes/com/apple/laf/AquaPainter.java index 38884ac7e..a5bc8fb25 100644 --- a/src/macosx/classes/com/apple/laf/AquaPainter.java +++ b/src/macosx/classes/com/apple/laf/AquaPainter.java @@ -148,34 +148,44 @@ abstract class AquaPainter { 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); + + Image baseImage = createImage(width, height, bounds, control, + controlState); + + img = new MultiResolutionBufferedImage(baseImage, + (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 +197,17 @@ abstract class AquaPainter { 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 +220,7 @@ abstract class AquaPainter { 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 +235,7 @@ abstract class AquaPainter { 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; } -- cgit v1.2.3