diff --git a/source/net/filebot/Main.java b/source/net/filebot/Main.java index 476f9e50..46979f47 100644 --- a/source/net/filebot/Main.java +++ b/source/net/filebot/Main.java @@ -203,14 +203,14 @@ public class Main { MacAppUtilities.initializeApplication(FileBotMenuBar.createHelp(), files -> SwingEventBus.getInstance().post(new FileTransferable(files))); } else if (isUbuntuApp()) { // Ubuntu/Debian specific configuration - frame.setIconImages(ResourceManager.getApplicationIcons()); + frame.setIconImages(ResourceManager.getApplicationIconImages()); } else if (isWindowsApp()) { // Windows specific configuration WinAppUtilities.initializeApplication(); - frame.setIconImages(ResourceManager.getApplicationIcons()); + frame.setIconImages(ResourceManager.getApplicationIconImages()); } else { // generic Linux/FreeBSD/Solaris configuration - frame.setIconImages(ResourceManager.getApplicationIcons()); + frame.setIconImages(ResourceManager.getApplicationIconImages()); } // start application diff --git a/source/net/filebot/ResourceManager.java b/source/net/filebot/ResourceManager.java index 3337329f..23750d11 100644 --- a/source/net/filebot/ResourceManager.java +++ b/source/net/filebot/ResourceManager.java @@ -1,97 +1,85 @@ package net.filebot; +import static java.util.Arrays.*; +import static java.util.Collections.*; import static java.util.stream.Collectors.*; import java.awt.Image; import java.awt.Toolkit; +import java.awt.image.BaseMultiResolutionImage; import java.net.URL; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.stream.Stream; +import javax.imageio.ImageIO; import javax.swing.Icon; import javax.swing.ImageIcon; -import net.filebot.util.WeakValueHashMap; - public final class ResourceManager { - private static final WeakValueHashMap cache = new WeakValueHashMap(256); + private static final Map cache = synchronizedMap(new HashMap(256)); - public static Icon getIcon(String name) { - return getIcon(name, null); + public static Icon getIcon(String... name) { + return getIcon(asList(name)); } - public static Icon getIcon(String name, String def) { - Icon icon = null; - - // try cache - synchronized (cache) { - icon = cache.get(name); - if (icon != null) { - return icon; + private static Icon getIcon(List icons) { + return cache.computeIfAbsent(icons.get(0), i -> { + // load image + URL[] resource = getMultiResolutionImageResource(i); + if (resource.length > 0) { + return new ImageIcon(getMultiResolutionImage(resource)); + } + + // try next image + if (icons.size() > 0) { + return getIcon(icons.subList(1, icons.size())); } - } - URL resource = getImageResource(name, def); - if (resource == null) { return null; - } - - Image image = getImage(resource); - icon = new ImageIcon(image); - - // update cache - synchronized (cache) { - cache.put(name, icon); - } - - return icon; + }); } public static Stream getApplicationIconResources() { return Stream.of("window.icon.large", "window.icon.medium", "window.icon.small").map(ResourceManager::getImageResource); } - public static List getApplicationIcons() { - return getApplicationIconResources().map(ResourceManager::getImage).collect(toList()); + public static List getApplicationIconImages() { + return getApplicationIconResources().map(ResourceManager::getToolkitImage).collect(toList()); } public static Icon getFlagIcon(String languageCode) { return getIcon("flags/" + languageCode); } - public static Image getImage(String name) { - return getImage(getImageResource(name)); - } - - private static Image getImage(URL resource) { + private static Image getToolkitImage(URL resource) { // load sun.awt.image.ToolkitImage or sun.awt.image.MultiResolutionToolkitImage (via @2x convention) return Toolkit.getDefaultToolkit().getImage(resource); } - /** - * Get the URL of an image resource in this jar. Image must be located in resources/ and the file type is assumed to be png. - * - * @param name - * simple name of the resource (without extension) - * @return URL of the resource or null if resource does not exist - */ + private static Image getMultiResolutionImage(URL[] resource) { + try { + Image[] image = new Image[resource.length]; + for (int i = 0; i < image.length; i++) { + image[i] = ImageIO.read(resource[i]); + } + return new BaseMultiResolutionImage(image); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static URL[] getMultiResolutionImageResource(String name) { + return Stream.of(name, name + "@2x").map(ResourceManager::getImageResource).filter(Objects::nonNull).toArray(URL[]::new); + } + private static URL getImageResource(String name) { return ResourceManager.class.getResource("resources/" + name + ".png"); } - private static URL getImageResource(String name, String def) { - URL resource = getImageResource(name); - - if (resource == null) - resource = getImageResource(def); - - return resource; - } - - /** - * Dummy constructor to prevent instantiation. - */ private ResourceManager() { throw new UnsupportedOperationException(); }