src/macosx/classes/com/apple/laf/AquaPainter.java
Print this page
@@ -146,37 +146,51 @@
final Rectangle bounds) {
if (bounds.width <= 0 || bounds.height <= 0) {
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);
}
+ }
+
+ 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);
- }
-
- g.drawImage(img, bounds.x, bounds.y, bounds.width, bounds.height, null);
+ return img;
}
}
private static class AquaPixelsKey implements ImageCache.PixelsKey {
@@ -185,21 +199,21 @@
// key parts
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();
}
public int getPixelCount() {
@@ -208,11 +222,11 @@
private int hash() {
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;
}
@Override
@@ -223,11 +237,11 @@
@Override
public boolean equals(Object obj) {
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;
}
}