--- old/src/share/classes/sun/awt/SunToolkit.java 2013-11-28 18:13:32.000000000 +0400 +++ new/src/share/classes/sun/awt/SunToolkit.java 2013-11-28 18:13:31.000000000 +0400 @@ -36,6 +36,9 @@ import java.awt.TrayIcon; import java.awt.SystemTray; import java.awt.event.InputEvent; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; import java.net.URL; import java.util.*; import java.util.concurrent.TimeUnit; @@ -715,33 +718,7 @@ static final SoftCache imgCache = new SoftCache(); static Image getImageFromHash(Toolkit tk, URL url) { - SecurityManager sm = System.getSecurityManager(); - if (sm != null) { - try { - java.security.Permission perm = - url.openConnection().getPermission(); - if (perm != null) { - try { - sm.checkPermission(perm); - } catch (SecurityException se) { - // fallback to checkRead/checkConnect for pre 1.2 - // security managers - if ((perm instanceof java.io.FilePermission) && - perm.getActions().indexOf("read") != -1) { - sm.checkRead(perm.getName()); - } else if ((perm instanceof - java.net.SocketPermission) && - perm.getActions().indexOf("connect") != -1) { - sm.checkConnect(url.getHost(), url.getPort()); - } else { - throw se; - } - } - } - } catch (java.io.IOException ioe) { - sm.checkConnect(url.getHost(), url.getPort()); - } - } + checkPermissions(url); synchronized (imgCache) { Image img = (Image)imgCache.get(url); if (img == null) { @@ -757,10 +734,7 @@ static Image getImageFromHash(Toolkit tk, String filename) { - SecurityManager security = System.getSecurityManager(); - if (security != null) { - security.checkRead(filename); - } + checkPermissions(filename); synchronized (imgCache) { Image img = (Image)imgCache.get(filename); if (img == null) { @@ -782,42 +756,42 @@ return getImageFromHash(this, url); } - public Image createImage(String filename) { - SecurityManager security = System.getSecurityManager(); - if (security != null) { - security.checkRead(filename); + protected Image getImageWithResolutionVariant(String fileName, + String resolutionVariantName) { + synchronized (imgCache) { + Image image = getImageFromHash(this, fileName); + if (image instanceof MultiResolutionImage) { + return image; + } + Image resolutionVariant = getImageFromHash(this, resolutionVariantName); + image = createImageWithResolutionVariant(image, resolutionVariant); + imgCache.put(fileName, image); + return image; + } + } + + protected Image getImageWithResolutionVariant(URL url, + URL resolutionVariantURL) { + synchronized (imgCache) { + Image image = getImageFromHash(this, url); + if (image instanceof MultiResolutionImage) { + return image; + } + Image resolutionVariant = getImageFromHash(this, resolutionVariantURL); + image = createImageWithResolutionVariant(image, resolutionVariant); + imgCache.put(url, image); + return image; } + } + + + public Image createImage(String filename) { + checkPermissions(filename); return createImage(new FileImageSource(filename)); } public Image createImage(URL url) { - SecurityManager sm = System.getSecurityManager(); - if (sm != null) { - try { - java.security.Permission perm = - url.openConnection().getPermission(); - if (perm != null) { - try { - sm.checkPermission(perm); - } catch (SecurityException se) { - // fallback to checkRead/checkConnect for pre 1.2 - // security managers - if ((perm instanceof java.io.FilePermission) && - perm.getActions().indexOf("read") != -1) { - sm.checkRead(perm.getName()); - } else if ((perm instanceof - java.net.SocketPermission) && - perm.getActions().indexOf("connect") != -1) { - sm.checkConnect(url.getHost(), url.getPort()); - } else { - throw se; - } - } - } - } catch (java.io.IOException ioe) { - sm.checkConnect(url.getHost(), url.getPort()); - } - } + checkPermissions(url); return createImage(new URLImageSource(url)); } @@ -829,6 +803,11 @@ return new ToolkitImage(producer); } + public static Image createImageWithResolutionVariant(Image image, + Image resolutionVariant) { + return new MultiResolutionToolkitImage(image, resolutionVariant); + } + public int checkImage(Image img, int w, int h, ImageObserver o) { if (!(img instanceof ToolkitImage)) { return ImageObserver.ALLBITS; @@ -841,7 +820,7 @@ } else { repbits = tkimg.getImageRep().check(o); } - return tkimg.check(o) | repbits; + return (tkimg.check(o) | repbits) & checkResolutionVariant(img, w, h, o); } public boolean prepareImage(Image img, int w, int h, ImageObserver o) { @@ -863,7 +842,97 @@ return false; } ImageRepresentation ir = tkimg.getImageRep(); - return ir.prepare(o); + return ir.prepare(o) & prepareResolutionVariant(img, w, h, o); + } + + private int checkResolutionVariant(Image img, int w, int h, ImageObserver o) { + ToolkitImage rvImage = getResolutionVariant(img); + // Ignore the resolution variant in case of error + return (rvImage == null || rvImage.hasError()) ? 0xFFFF : + checkImage(rvImage, 2 * w, 2 * h, MultiResolutionToolkitImage. + getResolutionVariantObserver( + img, o, w, h, 2 * w, 2 * h)); + } + + private boolean prepareResolutionVariant(Image img, int w, int h, + ImageObserver o) { + + ToolkitImage rvImage = getResolutionVariant(img); + // Ignore the resolution variant in case of error + return rvImage == null || rvImage.hasError() || prepareImage( + rvImage, 2 * w, 2 * h, + MultiResolutionToolkitImage.getResolutionVariantObserver( + img, o, w, h, 2 * w, 2 * h)); + } + + private static ToolkitImage getResolutionVariant(Image image) { + if (image instanceof MultiResolutionToolkitImage) { + Image resolutionVariant = ((MultiResolutionToolkitImage) image). + getResolutionVariant(); + if (resolutionVariant instanceof ToolkitImage) { + return (ToolkitImage) resolutionVariant; + } + } + return null; + } + + protected static boolean imageCached(Object key) { + return imgCache.containsKey(key); + } + + protected static boolean imageExists(String filename) { + checkPermissions(filename); + return filename != null && new File(filename).exists(); + } + + @SuppressWarnings("try") + protected static boolean imageExists(URL url) { + checkPermissions(url); + if (url != null) { + try (InputStream is = url.openStream()) { + return true; + }catch(IOException e){ + return false; + } + } + return false; + } + + private static void checkPermissions(String filename) { + SecurityManager security = System.getSecurityManager(); + if (security != null) { + security.checkRead(filename); + } + } + + private static void checkPermissions(URL url) { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) { + try { + java.security.Permission perm = + url.openConnection().getPermission(); + if (perm != null) { + try { + sm.checkPermission(perm); + } catch (SecurityException se) { + // fallback to checkRead/checkConnect for pre 1.2 + // security managers + if ((perm instanceof java.io.FilePermission) && + perm.getActions().indexOf("read") != -1) { + sm.checkRead(perm.getName()); + } else if ((perm instanceof + java.net.SocketPermission) && + perm.getActions().indexOf("connect") != -1) { + sm.checkConnect(url.getHost(), url.getPort()); + } else { + throw se; + } + } + } + } catch (java.io.IOException ioe) { + sm.checkConnect(url.getHost(), url.getPort()); + } + } } /**