aboutsummaryrefslogtreecommitdiff
path: root/src/macosx/classes/com/apple
diff options
context:
space:
mode:
authoralexsch <none@none>2014-04-10 14:33:24 +0400
committeralexsch <none@none>2014-04-10 14:33:24 +0400
commit58cb76db60720905eab603004b71962b16092a16 (patch)
tree56d2656827eec7bef45741b698e60947a1c90bf6 /src/macosx/classes/com/apple
parent88aeb0e97fc3493b4425cb90f1886a78038892fc (diff)
8032667: [macosx] Components cannot be rendered in HiDPI to BufferedImage
Reviewed-by: serb, pchelko
Diffstat (limited to 'src/macosx/classes/com/apple')
-rw-r--r--src/macosx/classes/com/apple/laf/AquaPainter.java54
1 files changed, 32 insertions, 22 deletions
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 <T extends JRSUIState> {
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 <T extends JRSUIState> {
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 <T extends JRSUIState> {
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 <T extends JRSUIState> {
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;
}