src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java

Print this page

        

@@ -33,18 +33,23 @@
 import java.awt.event.InvocationEvent;
 import java.awt.event.KeyEvent;
 import java.awt.im.InputMethodHighlight;
 import java.awt.peer.*;
 import java.lang.reflect.*;
+import java.io.File;
+import java.io.InputStream;
+import java.net.URL;
 import java.security.*;
 import java.util.*;
 import java.util.concurrent.Callable;
 
 import sun.awt.*;
+import sun.awt.image.ToolkitImage;
 import sun.lwawt.*;
 import sun.lwawt.LWWindowPeer.PeerType;
 import sun.security.action.GetBooleanAction;
+import com.sun.awt.MultiResolutionImage;
 
 import sun.util.CoreResourceBundleControl;
 
 class NamedCursor extends Cursor {
     NamedCursor(String name) {

@@ -487,13 +492,41 @@
     }
 
     @Override
     public Image getImage(final String filename) {
         final Image nsImage = checkForNSImage(filename);
-        if (nsImage != null) return nsImage;
+        if (nsImage != null) {
+            return nsImage;
+        }
+
+        Image image = super.getImage(filename);
+        Image scalableImage = ScalableToolkitImage.toScalableImage(image, filename);
+        if (image != scalableImage) {
+            putImageToCache(filename, (ToolkitImage) scalableImage);
+        }
+        return scalableImage;
+    }
+
+    @Override
+    public Image getImage(URL url) {
+        Image image = super.getImage(url);
+        Image scalableImage = ScalableToolkitImage.toScalableImage(image, url);
+        if (image != scalableImage) {
+            putImageToCache(url, (ToolkitImage) scalableImage);
+        }
+        return scalableImage;
+    }
+
+    @Override
+    public Image createImage(String filename) {
+        return ScalableToolkitImage.toScalableImage(
+                super.createImage(filename), filename);
+    }
 
-        return super.getImage(filename);
+    @Override
+    public Image createImage(URL url) {
+        return ScalableToolkitImage.toScalableImage(super.createImage(url), url);
     }
 
     static final String nsImagePrefix = "NSImage://";
     protected Image checkForNSImage(final String imageName) {
         if (imageName == null) return null;

@@ -779,6 +812,77 @@
 
     @Override
     public boolean enableInputMethodsForTextComponent() {
         return true;
     }
+
+    public static final class ScalableToolkitImage extends ToolkitImage implements MultiResolutionImage {
+
+        Image highResolutionImage;
+
+        public ScalableToolkitImage(Image lowResolutionImage, Image highResolutionImage) {
+            super(lowResolutionImage.getSource());
+            this.highResolutionImage = highResolutionImage;
+        }
+
+        @Override
+        public Image getResolutionVariant(int width, int height) {
+            return ((width <= getWidth() && height <= getHeight()))
+                    ? this : highResolutionImage;
+        }
+
+        static Image toScalableImage(Image image, String fileName) {
+
+            if (fileName != null && !fileName.contains("@2x")
+                    && !(image instanceof ScalableToolkitImage)) {
+                String filename2x = getScaledImageName(fileName);
+                if (filename2x != null && new File(filename2x).exists()) {
+                    return new ScalableToolkitImage(image, getDefaultToolkit().getImage(filename2x));
+                }
+            }
+            return image;
+        }
+
+        static Image toScalableImage(Image image, URL url) {
+
+            if (url != null && !url.toString().contains("@2x")
+                    && !(image instanceof ScalableToolkitImage)) {
+                try {
+                    URL url2x = getScaledImageURL(url);
+
+                    if (url2x != null) {
+                        try (InputStream is = url2x.openStream()) {
+                            return new ScalableToolkitImage(image,
+                                    getDefaultToolkit().getImage(url2x));
+                        }
+                    }
+                } catch (Exception ignore) {
+                }
+            }
+            return image;
+        }
+
+        private static URL getScaledImageURL(URL url) throws Exception {
+            String scaledImagePath = getScaledImageName(url.getPath());
+            return scaledImagePath == null ? null : new URL(url.getProtocol(),
+                    url.getHost(), url.getPort(), scaledImagePath);
+        }
+
+        private static String getScaledImageName(String path) {
+            if (!isValidPath(path)) {
+                return null;
+            }
+            int slash = path.lastIndexOf('/');
+            String name = (slash < 0) ? path : path.substring(slash + 1);
+
+            int dot = name.lastIndexOf('.');
+            String name2x = (dot < 0) ? name + "@2x"
+                    : name.substring(0, dot) + "@2x" + name.substring(dot);
+            return (slash < 0) ? name2x : path.substring(0, slash + 1) + name2x;
+        }
+
+        private static boolean isValidPath(String path) {
+            return !path.isEmpty() && !path.endsWith("/") && !path.endsWith(".");
+        }
+
+    }
 }