< prev index next >

src/java.desktop/share/classes/sun/awt/SunToolkit.java

Print this page

        

*** 35,45 **** import java.awt.image.ImageObserver; import java.awt.image.ImageProducer; import java.awt.image.Raster; import java.awt.peer.FramePeer; import java.awt.peer.KeyboardFocusManagerPeer; - import java.awt.peer.MouseInfoPeer; import java.awt.peer.SystemTrayPeer; import java.awt.peer.TrayIconPeer; import java.io.File; import java.io.IOException; import java.io.InputStream; --- 35,44 ----
*** 67,78 **** --- 66,80 ---- import sun.font.FontDesignMetrics; import sun.net.util.URLUtil; import sun.security.action.GetBooleanAction; import sun.security.action.GetPropertyAction; import sun.util.logging.PlatformLogger; + import java.util.List; + import sun.awt.image.MultiResolutionToolkitImage.ResolutionVariantItem; import static java.awt.RenderingHints.*; + import java.util.LinkedList; public abstract class SunToolkit extends Toolkit implements ComponentFactory, InputMethodSupport, KeyboardFocusManagerPeerProvider { // 8014718: logging has been removed from SunToolkit
*** 687,733 **** } } @Override public Image getImage(String filename) { ! return getImageFromHash(this, filename); } @Override public Image getImage(URL url) { return getImageFromHash(this, url); } ! protected Image getImageWithResolutionVariant(String fileName, ! String resolutionVariantName) { synchronized (fileImgCache) { ! Image image = getImageFromHash(this, fileName); ! if (image instanceof MultiResolutionImage) { ! return image; } - Image resolutionVariant = getImageFromHash(this, resolutionVariantName); - image = createImageWithResolutionVariant(image, resolutionVariant); - fileImgCache.put(fileName, image); - return image; } } - protected Image getImageWithResolutionVariant(URL url, - URL resolutionVariantURL) { synchronized (urlImgCache) { ! Image image = getImageFromHash(this, url); ! if (image instanceof MultiResolutionImage) { ! return image; } ! Image resolutionVariant = getImageFromHash(this, resolutionVariantURL); ! image = createImageWithResolutionVariant(image, resolutionVariant); ! String key = url.toString(); ! urlImgCache.put(key, image); ! return image; } } @Override public Image createImage(String filename) { checkPermissions(filename); return createImage(new FileImageSource(filename)); --- 689,855 ---- } } @Override public Image getImage(String filename) { ! return getImageUsingNamingSchemes(filename, getNamingSchemes()); } + @Override public Image getImage(URL url) { + return getImageUsingNamingSchemes(url, getNamingSchemes()); + } + + public Image getResolutionVariant(String filename) { + return getImageFromHash(this, filename); + } + + public Image getResolutionVariant(URL url) { return getImageFromHash(this, url); } ! public static Image getImageUsingNamingSchemes(Toolkit toolkit, String fileName, ! MediaResolutionNamingScheme... namingSchemes) { ! ! SunToolkit sunToolkit = null; ! if(toolkit instanceof SunToolkit){ ! sunToolkit = (SunToolkit) toolkit; ! } ! synchronized (fileImgCache) { ! Image baseImage = sunToolkit == null ! ? toolkit.getImage(fileName) ! : sunToolkit.getResolutionVariant(fileName); ! ! if (fileName == null || namingSchemes.length == 0 ! || (baseImage instanceof MultiResolutionImage)) { ! return baseImage; ! } ! ! LinkedList<ResolutionVariantItem> rvItems = new LinkedList<>(); ! String[] rvNames = getRVNames(fileName, namingSchemes); ! ! for (int i = 0; i < namingSchemes.length; i++) { ! String rvName = rvNames[i]; ! if (imageExists(rvName)) { ! Image rvImage = sunToolkit == null ! ? toolkit.getImage(rvName) ! : sunToolkit.getResolutionVariant(rvName); ! float scale = namingSchemes[i].getScale(); ! rvItems.add(new ResolutionVariantItem(rvImage, scale, scale)); ! } ! } ! ! if (rvItems.isEmpty()) { ! return baseImage; ! } ! ! rvItems.addFirst(new ResolutionVariantItem(baseImage, 1, 1)); ! Image mrImage = new MultiResolutionToolkitImage(baseImage, rvItems); ! ! fileImgCache.put(fileName, mrImage); ! return mrImage; } } + + public static Image getImageUsingNamingSchemes(Toolkit toolkit, URL url, + MediaResolutionNamingScheme... namingSchemes) { + + SunToolkit sunToolkit = null; + if(toolkit instanceof SunToolkit){ + sunToolkit = (SunToolkit) toolkit; } synchronized (urlImgCache) { ! Image baseImage = sunToolkit == null ! ? toolkit.getImage(url) ! : sunToolkit.getResolutionVariant(url); ! ! if (url == null || namingSchemes.length == 0 ! || (baseImage instanceof MultiResolutionImage)) { ! return baseImage; } ! ! LinkedList<ResolutionVariantItem> rvItems = new LinkedList<>(); ! String[] rvNames = getRVNames(url.getPath(), namingSchemes); ! ! for (int i = 0; i < namingSchemes.length; i++) { ! String rvName = rvNames[i]; ! URL rvURL; ! try { ! rvURL = new URL(url.getProtocol(), url.getHost(), ! url.getPort(), rvName); ! } catch (Exception e) { ! continue; ! } ! if (imageExists(rvURL)) { ! Image rvImage = sunToolkit == null ! ? toolkit.getImage(rvURL) ! : sunToolkit.getResolutionVariant(rvURL); ! float scale = namingSchemes[i].getScale(); ! rvItems.add(new ResolutionVariantItem(rvImage, scale, scale)); ! } ! } ! ! if (rvItems.isEmpty()) { ! return baseImage; ! } ! ! rvItems.addFirst(new ResolutionVariantItem(baseImage, 1, 1)); ! Image mrImage = new MultiResolutionToolkitImage(baseImage, rvItems); ! ! urlImgCache.put(url.toString(), mrImage); ! ! return mrImage; ! } ! } ! ! private static String[] getRVNames(String fileName, ! MediaResolutionNamingScheme... namingSchemes) { ! ! if (!isValidPath(fileName)) { ! return null; ! } ! ! int slash = fileName.lastIndexOf('/'); ! String name = (slash < 0) ? fileName : fileName.substring(slash + 1); ! ! int dot = name.lastIndexOf('.'); ! String ext = (dot < 0) ? "" : name.substring(dot); ! name = (dot < 0) ? name : name.substring(0, dot); ! String prefix = (slash < 0) ? name : fileName.substring(0, slash + 1) + name; ! ! String[] rvNames = new String[namingSchemes.length]; ! ! for (int i = 0; i < namingSchemes.length; i++) { ! rvNames[i] = prefix + namingSchemes[i].getQualifier() + ext; ! } ! ! return rvNames; } + + private static boolean isValidPath(String path) { + return path != null + && !path.isEmpty() + && !path.endsWith("/") + && !path.endsWith("."); } + private static MediaResolutionNamingScheme[] DEFAULT_NAMING_SCHEME = { + new MediaResolutionNamingScheme("@125pct", 1.25f), + new MediaResolutionNamingScheme("@150pct", 1.5f), + new MediaResolutionNamingScheme("@2x", 2f), + new MediaResolutionNamingScheme("@200pct", 2f), + new MediaResolutionNamingScheme("@250pct", 2.5f), + new MediaResolutionNamingScheme("@3x", 3f), + new MediaResolutionNamingScheme("@300pct", 3f) + }; + + protected MediaResolutionNamingScheme[] getNamingSchemes() { + return DEFAULT_NAMING_SCHEME; + } @Override public Image createImage(String filename) { checkPermissions(filename); return createImage(new FileImageSource(filename));
*** 747,761 **** @Override public Image createImage(ImageProducer producer) { return new ToolkitImage(producer); } - public static Image createImageWithResolutionVariant(Image image, - Image resolutionVariant) { - return new MultiResolutionToolkitImage(image, resolutionVariant); - } - @Override public int checkImage(Image img, int w, int h, ImageObserver o) { if (!(img instanceof ToolkitImage)) { return ImageObserver.ALLBITS; } --- 869,878 ----
*** 765,775 **** if (w == 0 || h == 0) { repbits = ImageObserver.ALLBITS; } else { repbits = tkimg.getImageRep().check(o); } ! return (tkimg.check(o) | repbits) & checkResolutionVariant(img, w, h, o); } @Override public boolean prepareImage(Image img, int w, int h, ImageObserver o) { if (w == 0 || h == 0) { --- 882,892 ---- if (w == 0 || h == 0) { repbits = ImageObserver.ALLBITS; } else { repbits = tkimg.getImageRep().check(o); } ! return (tkimg.check(o) | repbits) & checkResolutionVariants(img, w, h, o); } @Override public boolean prepareImage(Image img, int w, int h, ImageObserver o) { if (w == 0 || h == 0) {
*** 788,837 **** -1, -1, -1, -1); } return false; } ImageRepresentation ir = tkimg.getImageRep(); ! return ir.prepare(o) & prepareResolutionVariant(img, w, h, o); } ! private int checkResolutionVariant(Image img, int w, int h, ImageObserver o) { ! ToolkitImage rvImage = getResolutionVariant(img); ! int rvw = getRVSize(w); ! int rvh = getRVSize(h); ! // Ignore the resolution variant in case of error ! return (rvImage == null || rvImage.hasError()) ? 0xFFFF : ! checkImage(rvImage, rvw, rvh, MultiResolutionToolkitImage. ! getResolutionVariantObserver( ! img, o, w, h, rvw, rvh, true)); } ! private boolean prepareResolutionVariant(Image img, int w, int h, ! ImageObserver o) { ! ToolkitImage rvImage = getResolutionVariant(img); ! int rvw = getRVSize(w); ! int rvh = getRVSize(h); ! // Ignore the resolution variant in case of error ! return rvImage == null || rvImage.hasError() || prepareImage( ! rvImage, rvw, rvh, MultiResolutionToolkitImage.getResolutionVariantObserver( ! img, o, w, h, rvw, rvh, true)); } ! private static int getRVSize(int size){ ! return size == -1 ? -1 : 2 * size; ! } ! 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(String fileName) { return fileImgCache.containsKey(fileName); } --- 905,961 ---- -1, -1, -1, -1); } return false; } ImageRepresentation ir = tkimg.getImageRep(); ! return ir.prepare(o) & prepareResolutionVariants(img, w, h, o); } ! private int checkResolutionVariants(Image img, int w, int h, ImageObserver o) { ! if (!(img instanceof MultiResolutionToolkitImage)) { ! return 0xFFFF; } ! List<ResolutionVariantItem> rvItems ! = ((MultiResolutionToolkitImage) img).getResolutionVariantItems(); ! return rvItems.stream().map(rvItem -> { ! double scaleX = rvItem.getScaleX(); ! double scaleY = rvItem.getScaleY(); ! return checkImage( ! rvItem.getImage(), ! getRVSize(w, scaleX), ! getRVSize(h, scaleY), MultiResolutionToolkitImage.getResolutionVariantObserver( ! img, o, scaleX, scaleY, true)); ! }).reduce(0xFFFF , (a, b) -> a & b); } ! private boolean prepareResolutionVariants(Image img, int w, int h, ! ImageObserver o) { ! if (!(img instanceof MultiResolutionToolkitImage)) { ! return true; } + + List<ResolutionVariantItem> rvItems + = ((MultiResolutionToolkitImage) img).getResolutionVariantItems(); + + return rvItems.stream().map(rvItem -> { + double scaleX = rvItem.getScaleX(); + double scaleY = rvItem.getScaleY(); + return prepareImage( + rvItem.getImage(), + getRVSize(w, scaleX), + getRVSize(h, scaleY), + MultiResolutionToolkitImage.getResolutionVariantObserver( + img, o, scaleX, scaleY, true)); + }).reduce(true, (a, b) -> a && b); } ! ! private static int getRVSize(int size, double scale) { ! return (scale == 1 || size == -1) ? size : (int) Math.ceil(scale * size); } protected static boolean imageCached(String fileName) { return fileImgCache.containsKey(fileName); }
< prev index next >