src/macosx/classes/com/apple/laf/AquaIcon.java

Print this page

        

@@ -35,10 +35,11 @@
 import apple.laf.JRSUIConstants.Size;
 import apple.laf.*;
 
 import com.apple.laf.AquaUtilControlSize.*;
 import com.apple.laf.AquaUtils.RecyclableSingleton;
+import sun.awt.image.MultiResolutionBufferedImage;
 
 public class AquaIcon {
     interface InvertableIcon extends Icon {
         public Icon getInvertedIcon();
     }

@@ -193,17 +194,33 @@
         public CachableJRSUIIcon(final int width, final int height) {
             super(width, height);
         }
 
         Image createImage() {
-            final AquaPainter<JRSUIState> painter = AquaPainter.create(JRSUIState.getInstance());
+            final AquaPainter<JRSUIState> painter =
+                    AquaPainter.create(JRSUIState.getInstance());
             initIconPainter(painter);
 
-            final BufferedImage img = new BufferedImage(getIconWidth(), getIconHeight(), BufferedImage.TYPE_INT_ARGB_PRE);
+            final int w = getIconWidth();
+            final int h = getIconHeight();
+            Image baseImage = createImage(painter, w, h, w, h);
+
+            return new MultiResolutionBufferedImage(
+                    baseImage, (rvWidth, rvHeight) ->
+                            createImage(painter, w, h, rvWidth, rvHeight));
+        }
+
+        private static Image createImage(AquaPainter<JRSUIState> painter,
+                int width, int height, int rvWidth, int rvHeight) {
+            final BufferedImage img = new BufferedImage(rvWidth, rvHeight,
+                    BufferedImage.TYPE_INT_ARGB_PRE);
             final Graphics g = img.getGraphics();
-            g.setClip(new Rectangle(0, 0, getIconWidth(), getIconHeight()));
-            painter.paint(g, null, 0, 0, getIconWidth(), getIconHeight());
+            g.setClip(new Rectangle(0, 0, rvWidth, rvHeight));
+
+            ((Graphics2D) g).scale(rvWidth / width, rvHeight / height);
+            painter.paint(g, null, 0, 0, width, height);
+
             g.dispose();
             return img;
         }
 
         public abstract void initIconPainter(final AquaPainter<JRSUIState> painter);