From 5c219c7ea516b58cd8e5ba3685cbbae5f2797010 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Wed, 1 Aug 2018 16:29:16 -0700 Subject: [PATCH] ImageUtil: Add getResourceStreamFromClass method This replaces invocations of `Class.getResourceAsStream(path)` in order to relieve plugin/client code from managing synchronization and handling exceptions. --- .../client/game/SkillIconManager.java | 23 ++--- .../client/plugins/account/AccountPlugin.java | 17 +--- .../BarbarianAssaultPlugin.java | 7 +- .../client/plugins/boosts/BoostsPlugin.java | 9 +- .../plugins/cluescrolls/ClueScrollPlugin.java | 27 +----- .../client/plugins/config/ConfigPanel.java | 20 +---- .../client/plugins/config/ConfigPlugin.java | 8 +- .../client/plugins/config/PluginListItem.java | 51 +++++------ .../deathindicator/DeathIndicatorPlugin.java | 15 +--- .../plugins/devtools/DevToolsPlugin.java | 8 +- .../client/plugins/discord/DiscordPlugin.java | 8 +- .../farmingtracker/FarmingTrackerPlugin.java | 8 +- .../client/plugins/feed/FeedPanel.java | 15 +--- .../client/plugins/feed/FeedPlugin.java | 8 +- .../grandexchange/GrandExchangeOfferSlot.java | 17 +--- .../grandexchange/GrandExchangePlugin.java | 10 +-- .../GrandExchangeSearchPanel.java | 18 +--- .../client/plugins/hiscore/HiscorePanel.java | 90 ++++++------------- .../client/plugins/hiscore/HiscorePlugin.java | 8 +- .../client/plugins/info/InfoPanel.java | 23 ++--- .../client/plugins/info/InfoPlugin.java | 8 +- .../kourendlibrary/KourendLibraryPanel.java | 18 +--- .../kourendlibrary/KourendLibraryPlugin.java | 8 +- .../loottracker/LootTrackerPlugin.java | 8 +- .../plugins/mta/alchemy/AlchemyRoomTimer.java | 15 +--- .../client/plugins/notes/NotesPlugin.java | 8 +- .../runelite/client/plugins/poh/PohIcons.java | 15 +--- .../screenmarkers/ScreenMarkerPlugin.java | 8 +- .../ui/ScreenMarkerCreationPanel.java | 16 +--- .../screenmarkers/ui/ScreenMarkerPanel.java | 62 ++++++------- .../ui/ScreenMarkerPluginPanel.java | 19 +--- .../plugins/screenshot/ScreenshotPlugin.java | 54 +++++------ .../SkillCalculatorPlugin.java | 8 +- .../plugins/worldmap/TeleportPoint.java | 12 +-- .../plugins/worldmap/WorldMapPlugin.java | 25 ++---- .../plugins/xptracker/XpTrackerPlugin.java | 8 +- .../java/net/runelite/client/ui/ClientUI.java | 22 +---- .../net/runelite/client/util/ImageUtil.java | 26 ++++++ 38 files changed, 213 insertions(+), 517 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/game/SkillIconManager.java b/runelite-client/src/main/java/net/runelite/client/game/SkillIconManager.java index d3883be67b..03c78617b1 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/SkillIconManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/SkillIconManager.java @@ -25,11 +25,10 @@ package net.runelite.client.game; import java.awt.image.BufferedImage; -import java.io.IOException; -import javax.imageio.ImageIO; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Skill; +import net.runelite.client.util.ImageUtil; @Singleton @Slf4j @@ -48,21 +47,11 @@ public class SkillIconManager return imgCache[skillIdx]; } - try - { - String skillIconPath = (small ? "/skill_icons_small/" : "/skill_icons/") - + skill.getName().toLowerCase() + ".png"; - log.debug("Loading skill icon from {}", skillIconPath); - synchronized (ImageIO.class) - { - skillImage = ImageIO.read(SkillIconManager.class.getResourceAsStream(skillIconPath)); - } - imgCache[skillIdx] = skillImage; - } - catch (IOException e) - { - log.debug("Error Loading skill icons {}", e); - } + String skillIconPath = (small ? "/skill_icons_small/" : "/skill_icons/") + + skill.getName().toLowerCase() + ".png"; + log.debug("Loading skill icon from {}", skillIconPath); + skillImage = ImageUtil.getResourceStreamFromClass(getClass(), skillIconPath); + imgCache[skillIdx] = skillImage; return skillImage; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/account/AccountPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/account/AccountPlugin.java index fdf173829e..1be02b4eed 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/account/AccountPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/account/AccountPlugin.java @@ -26,9 +26,7 @@ package net.runelite.client.plugins.account; import com.google.common.eventbus.Subscribe; import java.awt.image.BufferedImage; -import java.io.IOException; import java.util.concurrent.ScheduledExecutorService; -import javax.imageio.ImageIO; import javax.inject.Inject; import javax.swing.JOptionPane; import lombok.extern.slf4j.Slf4j; @@ -40,6 +38,7 @@ import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.ClientToolbar; import net.runelite.client.ui.NavigationButton; +import net.runelite.client.util.ImageUtil; import net.runelite.client.util.RunnableExceptionLogger; @PluginDescriptor( @@ -67,18 +66,8 @@ public class AccountPlugin extends Plugin static { - try - { - synchronized (ImageIO.class) - { - LOGIN_IMAGE = ImageIO.read(AccountPlugin.class.getResourceAsStream("login_icon.png")); - LOGOUT_IMAGE = ImageIO.read(AccountPlugin.class.getResourceAsStream("logout_icon.png")); - } - } - catch (IOException e) - { - throw new RuntimeException(e); - } + LOGIN_IMAGE = ImageUtil.getResourceStreamFromClass(AccountPlugin.class, "login_icon.png"); + LOGOUT_IMAGE = ImageUtil.getResourceStreamFromClass(AccountPlugin.class, "logout_icon.png"); } @Override diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultPlugin.java index 01edaebce0..8b6c81e84d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barbarianassault/BarbarianAssaultPlugin.java @@ -30,7 +30,6 @@ import java.awt.Font; import java.awt.Image; import java.util.ArrayList; import java.util.List; -import javax.imageio.ImageIO; import javax.inject.Inject; import net.runelite.api.ChatMessageType; import net.runelite.api.Client; @@ -46,6 +45,7 @@ import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.overlay.OverlayManager; +import net.runelite.client.util.ImageUtil; @PluginDescriptor( name = "Barbarian Assault", @@ -87,10 +87,7 @@ public class BarbarianAssaultPlugin extends Plugin font = FontManager.getRunescapeFont() .deriveFont(Font.BOLD, 24); - synchronized (ImageIO.class) - { - clockImage = ImageIO.read(getClass().getResourceAsStream("clock.png")); - } + clockImage = ImageUtil.getResourceStreamFromClass(getClass(), "clock.png"); } @Override diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsPlugin.java index f734f0d9fa..acd8a2ef3b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsPlugin.java @@ -30,7 +30,6 @@ import com.google.inject.Provides; import java.util.Arrays; import java.util.HashSet; import java.util.Set; -import javax.imageio.ImageIO; import javax.inject.Inject; import javax.inject.Singleton; import lombok.Getter; @@ -49,6 +48,7 @@ import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; +import net.runelite.client.util.ImageUtil; @PluginDescriptor( name = "Boosts Information", @@ -118,11 +118,8 @@ public class BoostsPlugin extends Plugin Arrays.fill(lastSkillLevels, -1); // Add infoboxes for everything at startup and then determine inside if it will be rendered - synchronized (ImageIO.class) - { - infoBoxManager.addInfoBox(new StatChangeIndicator(true, ImageIO.read(getClass().getResourceAsStream("debuffed.png")), this, config)); - infoBoxManager.addInfoBox(new StatChangeIndicator(false, ImageIO.read(getClass().getResourceAsStream("buffed.png")), this, config)); - } + infoBoxManager.addInfoBox(new StatChangeIndicator(true, ImageUtil.getResourceStreamFromClass(getClass(), "debuffed.png"), this, config)); + infoBoxManager.addInfoBox(new StatChangeIndicator(false, ImageUtil.getResourceStreamFromClass(getClass(), "buffed.png"), this, config)); for (final Skill skill : Skill.values()) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java index 2f42c55011..c81ae85777 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java @@ -29,13 +29,11 @@ package net.runelite.client.plugins.cluescrolls; import com.google.common.eventbus.Subscribe; import com.google.inject.Provides; import java.awt.image.BufferedImage; -import java.io.IOException; import java.time.Duration; import java.time.Instant; import java.util.Arrays; import java.util.List; import java.util.stream.Stream; -import javax.imageio.ImageIO; import javax.inject.Inject; import lombok.Getter; import lombok.extern.slf4j.Slf4j; @@ -84,6 +82,7 @@ import net.runelite.client.plugins.cluescrolls.clues.ObjectClueScroll; import net.runelite.client.plugins.cluescrolls.clues.TextClueScroll; import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.ui.overlay.worldmap.WorldMapPointManager; +import net.runelite.client.util.ImageUtil; import net.runelite.client.util.QueryRunner; import net.runelite.client.util.Text; @@ -403,17 +402,7 @@ public class ClueScrollPlugin extends Plugin return emoteImage; } - try - { - synchronized (ImageIO.class) - { - emoteImage = ImageIO.read(getClass().getResourceAsStream("emote.png")); - } - } - catch (IOException e) - { - throw new RuntimeException(e); - } + emoteImage = ImageUtil.getResourceStreamFromClass(getClass(), "emote.png"); return emoteImage; } @@ -430,17 +419,7 @@ public class ClueScrollPlugin extends Plugin return mapArrow; } - try - { - synchronized (ImageIO.class) - { - mapArrow = ImageIO.read(getClass().getResourceAsStream("/util/clue_arrow.png")); - } - } - catch (IOException e) - { - throw new RuntimeException(e); - } + mapArrow = ImageUtil.getResourceStreamFromClass(getClass(), "/util/clue_arrow.png"); return mapArrow; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java index 49dc527f3d..2e37feca4a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java @@ -38,14 +38,12 @@ import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; -import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.concurrent.ScheduledExecutorService; import java.util.stream.Collectors; -import javax.imageio.ImageIO; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JButton; @@ -124,20 +122,10 @@ public class ConfigPanel extends PluginPanel static { - try - { - synchronized (ImageIO.class) - { - BufferedImage backIcon = ImageIO.read(ConfigPanel.class.getResourceAsStream("config_back_icon.png")); - BACK_ICON = new ImageIcon(backIcon); - BACK_ICON_HOVER = new ImageIcon(ImageUtil.alphaOffset(backIcon, -100)); - SEARCH = new ImageIcon(ImageIO.read(IconTextField.class.getResourceAsStream("search.png"))); - } - } - catch (IOException e) - { - throw new RuntimeException(e); - } + final BufferedImage backIcon = ImageUtil.getResourceStreamFromClass(ConfigPanel.class, "config_back_icon.png"); + BACK_ICON = new ImageIcon(backIcon); + BACK_ICON_HOVER = new ImageIcon(ImageUtil.alphaOffset(backIcon, -100)); + SEARCH = new ImageIcon(ImageUtil.getResourceStreamFromClass(IconTextField.class, "search.png")); } ConfigPanel(PluginManager pluginManager, ConfigManager configManager, ScheduledExecutorService executorService, diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java index f72c74c854..3b9af9868c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java @@ -27,7 +27,6 @@ package net.runelite.client.plugins.config; import com.google.common.eventbus.Subscribe; import java.awt.image.BufferedImage; import java.util.concurrent.ScheduledExecutorService; -import javax.imageio.ImageIO; import javax.inject.Inject; import javax.swing.SwingUtilities; import net.runelite.client.config.ChatColorConfig; @@ -39,6 +38,7 @@ import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginManager; import net.runelite.client.ui.NavigationButton; import net.runelite.client.ui.ClientToolbar; +import net.runelite.client.util.ImageUtil; @PluginDescriptor( name = "Configuration", @@ -73,11 +73,7 @@ public class ConfigPlugin extends Plugin { configPanel = new ConfigPanel(pluginManager, configManager, executorService, runeLiteConfig, chatColorConfig); - BufferedImage icon; - synchronized (ImageIO.class) - { - icon = ImageIO.read(getClass().getResourceAsStream("config_icon.png")); - } + final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "config_icon.png"); navButton = NavigationButton.builder() .tooltip("Configuration") diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java index b9ba675b80..e70643f6fa 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListItem.java @@ -29,12 +29,10 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.image.BufferedImage; -import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.annotation.Nullable; -import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; @@ -84,34 +82,27 @@ class PluginListItem extends JPanel static { - try - { - BufferedImage configIcon; - - synchronized (ImageIO.class) - { - configIcon = ImageIO.read(ConfigPanel.class.getResourceAsStream("config_edit_icon.png")); - CONFIG_ICON = new ImageIcon(configIcon); - ON_SWITCHER = new ImageIcon(ImageIO.read(ConfigPanel.class.getResourceAsStream("switcher_on.png"))); - ON_STAR = new ImageIcon(ImageIO.read(ConfigPanel.class.getResourceAsStream("star_on.png"))); - } - - BufferedImage offSwitcherImage = ImageUtil.bufferedImageFromImage(ON_SWITCHER.getImage()); - offSwitcherImage = ImageUtil.grayscaleImage(offSwitcherImage); - offSwitcherImage = ImageUtil.grayscaleOffset(offSwitcherImage, 0.61f); - offSwitcherImage = ImageUtil.flipImage(offSwitcherImage, true, false); - OFF_SWITCHER = new ImageIcon(offSwitcherImage); - BufferedImage offStarImage = ImageUtil.bufferedImageFromImage(ON_STAR.getImage()); - offStarImage = ImageUtil.grayscaleImage(offStarImage); - offStarImage = ImageUtil.grayscaleOffset(offStarImage, 0.77f); - OFF_STAR = new ImageIcon(offStarImage); - - CONFIG_ICON_HOVER = new ImageIcon(ImageUtil.alphaOffset(configIcon, -100)); - } - catch (IOException e) - { - throw new RuntimeException(e); - } + BufferedImage configIcon = ImageUtil.getResourceStreamFromClass(ConfigPanel.class, "config_edit_icon.png"); + BufferedImage onSwitcher = ImageUtil.getResourceStreamFromClass(ConfigPanel.class, "switcher_on.png"); + BufferedImage onStar = ImageUtil.getResourceStreamFromClass(ConfigPanel.class, "star_on.png"); + CONFIG_ICON = new ImageIcon(configIcon); + ON_SWITCHER = new ImageIcon(onSwitcher); + ON_STAR = new ImageIcon(onStar); + CONFIG_ICON_HOVER = new ImageIcon(ImageUtil.grayscaleOffset(configIcon, -100)); + BufferedImage offSwitcherImage = ImageUtil.flipImage( + ImageUtil.grayscaleOffset( + ImageUtil.grayscaleImage(onSwitcher), + 0.61f + ), + true, + false + ); + OFF_SWITCHER = new ImageIcon(offSwitcherImage); + BufferedImage offStar = ImageUtil.grayscaleOffset( + ImageUtil.grayscaleImage(onStar), + 0.77f + ); + OFF_STAR = new ImageIcon(offStar); } /** diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathIndicatorPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathIndicatorPlugin.java index b2ab4fd7a0..133a34cbb1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathIndicatorPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathIndicatorPlugin.java @@ -28,12 +28,10 @@ import com.google.common.collect.ImmutableSet; import com.google.common.eventbus.Subscribe; import com.google.inject.Provides; import java.awt.image.BufferedImage; -import java.io.IOException; import java.time.Duration; import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.Set; -import javax.imageio.ImageIO; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import static net.runelite.api.AnimationID.DEATH; @@ -53,6 +51,7 @@ import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; import net.runelite.client.ui.overlay.infobox.Timer; import net.runelite.client.ui.overlay.worldmap.WorldMapPointManager; +import net.runelite.client.util.ImageUtil; @PluginDescriptor( name = "Death Indicator", @@ -333,17 +332,7 @@ public class DeathIndicatorPlugin extends Plugin return mapArrow; } - try - { - synchronized (ImageIO.class) - { - mapArrow = ImageIO.read(getClass().getResourceAsStream("/util/clue_arrow.png")); - } - } - catch (IOException e) - { - throw new RuntimeException(e); - } + mapArrow = ImageUtil.getResourceStreamFromClass(getClass(), "/util/clue_arrow.png"); return mapArrow; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java index 981b023f8a..535b98cecb 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java @@ -32,7 +32,6 @@ import com.google.inject.Provides; import java.awt.Font; import java.awt.image.BufferedImage; import static java.lang.Math.min; -import javax.imageio.ImageIO; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import net.runelite.api.ChatMessageType; @@ -51,6 +50,7 @@ import net.runelite.client.ui.FontManager; import net.runelite.client.ui.NavigationButton; import net.runelite.client.ui.ClientToolbar; import net.runelite.client.ui.overlay.OverlayManager; +import net.runelite.client.util.ImageUtil; import org.slf4j.LoggerFactory; @PluginDescriptor( @@ -130,11 +130,7 @@ public class DevToolsPlugin extends Plugin final DevToolsPanel panel = injector.getInstance(DevToolsPanel.class); - BufferedImage icon; - synchronized (ImageIO.class) - { - icon = ImageIO.read(getClass().getResourceAsStream("devtools_icon.png")); - } + final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "devtools_icon.png"); navButton = NavigationButton.builder() .tooltip("Developer Tools") diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java index 0ee6689640..c2605d5186 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java @@ -33,7 +33,6 @@ import java.time.temporal.ChronoUnit; import java.util.EnumSet; import java.util.HashMap; import java.util.Map; -import javax.imageio.ImageIO; import net.runelite.api.Client; import static net.runelite.api.Constants.CHUNK_SIZE; import net.runelite.api.GameState; @@ -51,6 +50,7 @@ import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.task.Schedule; import net.runelite.client.ui.ClientToolbar; import net.runelite.client.ui.NavigationButton; +import net.runelite.client.util.ImageUtil; import net.runelite.client.util.LinkBrowser; @PluginDescriptor( @@ -88,11 +88,7 @@ public class DiscordPlugin extends Plugin @Override protected void startUp() throws Exception { - BufferedImage icon; - synchronized (ImageIO.class) - { - icon = ImageIO.read(getClass().getResourceAsStream("discord.png")); - } + final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "discord.png"); discordButton = NavigationButton.builder() .tab(false) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/farmingtracker/FarmingTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/farmingtracker/FarmingTrackerPlugin.java index f1127f62de..81c4b9c495 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/farmingtracker/FarmingTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/farmingtracker/FarmingTrackerPlugin.java @@ -29,7 +29,6 @@ import com.google.inject.Provides; import java.awt.image.BufferedImage; import java.time.Instant; import java.time.temporal.ChronoUnit; -import javax.imageio.ImageIO; import javax.inject.Inject; import javax.swing.SwingUtilities; import lombok.extern.slf4j.Slf4j; @@ -46,6 +45,7 @@ import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.task.Schedule; import net.runelite.client.ui.NavigationButton; import net.runelite.client.ui.ClientToolbar; +import net.runelite.client.util.ImageUtil; @PluginDescriptor( name = "Farming Tracker", @@ -88,11 +88,7 @@ public class FarmingTrackerPlugin extends Plugin @Override protected void startUp() throws Exception { - BufferedImage icon; - synchronized (ImageIO.class) - { - icon = ImageIO.read(getClass().getResourceAsStream("farming.png")); - } + final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "farming.png"); panel = new FarmingTrackerPanel(client, itemManager, configManager, config, farmingWorld); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPanel.java index 6c355a8c46..a9abb4636b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPanel.java @@ -53,6 +53,7 @@ import lombok.extern.slf4j.Slf4j; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.PluginPanel; +import net.runelite.client.util.ImageUtil; import net.runelite.client.util.LinkBrowser; import net.runelite.http.api.RuneLiteAPI; import net.runelite.http.api.feed.FeedItem; @@ -102,18 +103,8 @@ class FeedPanel extends PluginPanel static { - try - { - synchronized (ImageIO.class) - { - RUNELITE_ICON = new ImageIcon(ImageIO.read(FeedPanel.class.getResourceAsStream("runelite.png"))); - OSRS_ICON = new ImageIcon(ImageIO.read(FeedPanel.class.getResourceAsStream("osrs.png"))); - } - } - catch (IOException e) - { - throw new RuntimeException(e); - } + RUNELITE_ICON = new ImageIcon(ImageUtil.getResourceStreamFromClass(FeedPanel.class, "runelite.png")); + OSRS_ICON = new ImageIcon(ImageUtil.getResourceStreamFromClass(FeedPanel.class, "osrs.png")); } private final FeedConfig config; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPlugin.java index a54c272930..79ada10499 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/feed/FeedPlugin.java @@ -33,7 +33,6 @@ import java.time.temporal.ChronoUnit; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; -import javax.imageio.ImageIO; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import net.runelite.api.events.ConfigChanged; @@ -43,6 +42,7 @@ import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.task.Schedule; import net.runelite.client.ui.NavigationButton; import net.runelite.client.ui.ClientToolbar; +import net.runelite.client.util.ImageUtil; import net.runelite.http.api.feed.FeedClient; import net.runelite.http.api.feed.FeedResult; @@ -86,11 +86,7 @@ public class FeedPlugin extends Plugin { feedPanel = new FeedPanel(config, feedSupplier); - BufferedImage icon; - synchronized (ImageIO.class) - { - icon = ImageIO.read(getClass().getResourceAsStream("icon.png")); - } + final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "icon.png"); navButton = NavigationButton.builder() .tooltip("News Feed") diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlot.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlot.java index 45fdbe5371..8843193064 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlot.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeOfferSlot.java @@ -36,9 +36,7 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.image.BufferedImage; -import java.io.IOException; import javax.annotation.Nullable; -import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; @@ -84,18 +82,9 @@ public class GrandExchangeOfferSlot extends JPanel static { - try - { - synchronized (ImageIO.class) - { - RIGHT_ARROW_ICON = new ImageIcon(ImageUtil.alphaOffset(ImageIO.read(GrandExchangeOfferSlot.class.getResourceAsStream("/util/arrow_right.png")), 0.25f)); - LEFT_ARROW_ICON = new ImageIcon(ImageUtil.flipImage(ImageUtil.bufferedImageFromImage(RIGHT_ARROW_ICON.getImage()), true, false)); - } - } - catch (IOException e) - { - throw new RuntimeException(e); - } + final BufferedImage rightArrow = ImageUtil.alphaOffset(ImageUtil.getResourceStreamFromClass(GrandExchangeOfferSlot.class, "/util/arrow_right.png"), 0.25f); + RIGHT_ARROW_ICON = new ImageIcon(rightArrow); + LEFT_ARROW_ICON = new ImageIcon(ImageUtil.flipImage(rightArrow, true, false)); } /** diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java index ea278f3a19..3f59fa440d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java @@ -32,7 +32,6 @@ import com.google.inject.Provides; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.concurrent.ScheduledExecutorService; -import javax.imageio.ImageIO; import javax.inject.Inject; import javax.swing.SwingUtilities; import lombok.AccessLevel; @@ -66,6 +65,7 @@ import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.NavigationButton; import net.runelite.client.ui.ClientToolbar; +import net.runelite.client.util.ImageUtil; import net.runelite.client.util.StackFormatter; import net.runelite.client.util.Text; import net.runelite.http.api.osbuddy.GrandExchangeClient; @@ -134,15 +134,11 @@ public class GrandExchangePlugin extends Plugin } @Override - protected void startUp() throws IOException + protected void startUp() { panel = injector.getInstance(GrandExchangePanel.class); - BufferedImage icon; - synchronized (ImageIO.class) - { - icon = ImageIO.read(getClass().getResourceAsStream("ge_icon.png")); - } + final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "ge_icon.png"); button = NavigationButton.builder() .tooltip("Grand Exchange") diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java index 2cf3eca92d..20d28c7a16 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java @@ -31,11 +31,9 @@ import java.awt.CardLayout; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; -import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ScheduledExecutorService; -import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JPanel; import javax.swing.JScrollPane; @@ -96,19 +94,9 @@ class GrandExchangeSearchPanel extends JPanel static { - try - { - synchronized (ImageIO.class) - { - SEARCH_ICON = new ImageIcon(ImageUtil.alphaOffset(ImageUtil.grayscaleOffset(ImageIO.read(IconTextField.class.getResourceAsStream("search.png")), 0f), 1.75f)); - LOADING_ICON = new ImageIcon(IconTextField.class.getResource("loading_spinner.gif")); - ERROR_ICON = new ImageIcon(ImageIO.read(IconTextField.class.getResourceAsStream("error.png"))); - } - } - catch (IOException e) - { - throw new RuntimeException(e); - } + SEARCH_ICON = new ImageIcon(ImageUtil.alphaOffset(ImageUtil.grayscaleOffset(ImageUtil.getResourceStreamFromClass(IconTextField.class, "search.png"), 0f), 1.75f)); + LOADING_ICON = new ImageIcon(IconTextField.class.getResource("loading_spinner.gif")); + ERROR_ICON = new ImageIcon(ImageUtil.getResourceStreamFromClass(IconTextField.class, "error.png")); } GrandExchangeSearchPanel(Client client, ItemManager itemManager, ScheduledExecutorService executor) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java index f09412171c..2e0b558202 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java @@ -41,7 +41,6 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.ScheduledExecutorService; import javax.annotation.Nullable; -import javax.imageio.ImageIO; import javax.inject.Inject; import javax.swing.ImageIcon; import javax.swing.JLabel; @@ -57,6 +56,7 @@ import net.runelite.client.ui.PluginPanel; import net.runelite.client.ui.components.IconTextField; import net.runelite.client.ui.components.materialtabs.MaterialTab; import net.runelite.client.ui.components.materialtabs.MaterialTabGroup; +import net.runelite.client.util.ImageUtil; import net.runelite.client.util.RunnableExceptionLogger; import net.runelite.client.util.StackFormatter; import net.runelite.http.api.hiscore.HiscoreClient; @@ -146,19 +146,9 @@ public class HiscorePanel extends PluginPanel static { - try - { - synchronized (ImageIO.class) - { - SEARCH_ICON = new ImageIcon(ImageIO.read(IconTextField.class.getResourceAsStream("search.png"))); - LOADING_ICON = new ImageIcon(IconTextField.class.getResource("loading_spinner_darker.gif")); - ERROR_ICON = new ImageIcon(ImageIO.read(IconTextField.class.getResourceAsStream("error.png"))); - } - } - catch (IOException e) - { - throw new RuntimeException(e); - } + SEARCH_ICON = new ImageIcon(ImageUtil.getResourceStreamFromClass(IconTextField.class, "search.png")); + LOADING_ICON = new ImageIcon(IconTextField.class.getResource("loading_spinner_darker.gif")); + ERROR_ICON = new ImageIcon(ImageUtil.getResourceStreamFromClass(IconTextField.class, "error.png")); } @Inject @@ -220,51 +210,39 @@ public class HiscorePanel extends PluginPanel for (HiscoreEndpoint endpoint : HiscoreEndpoint.values()) { - try + final BufferedImage iconImage = ImageUtil.getResourceStreamFromClass(getClass(), endpoint.name().toLowerCase() + ".png"); + + MaterialTab tab = new MaterialTab(new ImageIcon(iconImage), tabGroup, null); + tab.setToolTipText(endpoint.getName() + " Hiscores"); + tab.setOnSelectEvent(() -> { - BufferedImage iconImage; - synchronized (ImageIO.class) + if (loading) { - iconImage = ImageIO.read(HiscorePanel.class.getResourceAsStream( - endpoint.name().toLowerCase() + ".png")); + return false; } - MaterialTab tab = new MaterialTab(new ImageIcon(iconImage), tabGroup, null); - tab.setToolTipText(endpoint.getName() + " Hiscores"); - tab.setOnSelectEvent(() -> + selectedEndPoint = endpoint; + return true; + }); + + // Adding the lookup method to a mouseListener instead of the above onSelectedEvent + // Because sometimes you might want to switch the tab, without calling for lookup + // Ex: selecting the normal hiscores as default + tab.addMouseListener(new MouseAdapter() + { + @Override + public void mousePressed(MouseEvent mouseEvent) { if (loading) { - return false; + return; } - selectedEndPoint = endpoint; - return true; - }); + executor.execute(HiscorePanel.this::lookup); + } + }); - // Adding the lookup method to a mouseListener instead of the above onSelectedEvent - // Because sometimes you might want to switch the tab, without calling for lookup - // Ex: selecting the normal hiscores as default - tab.addMouseListener(new MouseAdapter() - { - @Override - public void mousePressed(MouseEvent mouseEvent) - { - if (loading) - { - return; - } - - executor.execute(HiscorePanel.this::lookup); - } - }); - - tabGroup.addTab(tab); - } - catch (IOException ex) - { - throw new RuntimeException(ex); - } + tabGroup.addTab(tab); } // Default selected tab is normal hiscores @@ -343,19 +321,7 @@ public class HiscorePanel extends PluginPanel String skillIcon = directory + skillName + ".png"; log.debug("Loading skill icon from {}", skillIcon); - try - { - BufferedImage icon; - synchronized (ImageIO.class) - { - icon = ImageIO.read(HiscorePanel.class.getResourceAsStream(skillIcon)); - } - label.setIcon(new ImageIcon(icon)); - } - catch (IOException ex) - { - log.warn(null, ex); - } + label.setIcon(new ImageIcon(ImageUtil.getResourceStreamFromClass(getClass(), skillIcon))); boolean totalLabel = skill == HiscoreSkill.OVERALL || skill == null; //overall or combat label.setIconTextGap(totalLabel ? 10 : 4); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java index 56c350a1cc..f6f32b631a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java @@ -32,7 +32,6 @@ import java.awt.image.BufferedImage; import java.lang.reflect.InvocationTargetException; import java.util.concurrent.ScheduledExecutorService; import javax.annotation.Nullable; -import javax.imageio.ImageIO; import javax.inject.Inject; import javax.inject.Provider; import javax.swing.SwingUtilities; @@ -49,6 +48,7 @@ import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.NavigationButton; import net.runelite.client.ui.ClientToolbar; +import net.runelite.client.util.ImageUtil; import net.runelite.client.util.Text; import org.apache.commons.lang3.ArrayUtils; @@ -98,11 +98,7 @@ public class HiscorePlugin extends Plugin { hiscorePanel = injector.getInstance(HiscorePanel.class); - BufferedImage icon; - synchronized (ImageIO.class) - { - icon = ImageIO.read(getClass().getResourceAsStream("normal.png")); - } + final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "normal.png"); navButton = NavigationButton.builder() .tooltip("Hiscore") diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPanel.java index 6309d289d0..8aabb7e6b6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPanel.java @@ -36,10 +36,8 @@ import java.awt.Font; import java.awt.GridLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.io.IOException; import java.util.concurrent.ScheduledExecutorService; import javax.annotation.Nullable; -import javax.imageio.ImageIO; import javax.inject.Singleton; import javax.swing.Box; import javax.swing.ImageIcon; @@ -56,6 +54,7 @@ import net.runelite.client.account.SessionManager; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.PluginPanel; +import net.runelite.client.util.ImageUtil; import net.runelite.client.util.LinkBrowser; import net.runelite.client.util.RunnableExceptionLogger; @@ -92,21 +91,11 @@ public class InfoPanel extends PluginPanel static { - try - { - synchronized (ImageIO.class) - { - ARROW_RIGHT_ICON = new ImageIcon(ImageIO.read(InfoPanel.class.getResourceAsStream("/util/arrow_right.png"))); - GITHUB_ICON = new ImageIcon(ImageIO.read(InfoPanel.class.getResourceAsStream("github_icon.png"))); - DISCORD_ICON = new ImageIcon(ImageIO.read(InfoPanel.class.getResourceAsStream("discord_icon.png"))); - PATREON_ICON = new ImageIcon(ImageIO.read(InfoPanel.class.getResourceAsStream("patreon_icon.png"))); - WIKI_ICON = new ImageIcon(ImageIO.read(InfoPanel.class.getResourceAsStream("wiki_icon.png"))); - } - } - catch (IOException e) - { - throw new RuntimeException(e); - } + ARROW_RIGHT_ICON = new ImageIcon(ImageUtil.getResourceStreamFromClass(InfoPanel.class, "/util/arrow_right.png")); + GITHUB_ICON = new ImageIcon(ImageUtil.getResourceStreamFromClass(InfoPanel.class, "github_icon.png")); + DISCORD_ICON = new ImageIcon(ImageUtil.getResourceStreamFromClass(InfoPanel.class, "discord_icon.png")); + PATREON_ICON = new ImageIcon(ImageUtil.getResourceStreamFromClass(InfoPanel.class, "patreon_icon.png")); + WIKI_ICON = new ImageIcon(ImageUtil.getResourceStreamFromClass(InfoPanel.class, "wiki_icon.png")); } void init() diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPlugin.java index a394b6b0b7..f986a28ffa 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPlugin.java @@ -25,12 +25,12 @@ package net.runelite.client.plugins.info; import java.awt.image.BufferedImage; -import javax.imageio.ImageIO; import javax.inject.Inject; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.NavigationButton; import net.runelite.client.ui.ClientToolbar; +import net.runelite.client.util.ImageUtil; @PluginDescriptor( name = "Info Panel", @@ -50,11 +50,7 @@ public class InfoPlugin extends Plugin final InfoPanel panel = injector.getInstance(InfoPanel.class); panel.init(); - BufferedImage icon; - synchronized (ImageIO.class) - { - icon = ImageIO.read(getClass().getResourceAsStream("info_icon.png")); - } + final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "info_icon.png"); navButton = NavigationButton.builder() .tooltip("Info") diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPanel.java index 229c307769..29f5525919 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPanel.java @@ -33,14 +33,12 @@ import java.awt.GridBagLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; -import java.io.IOException; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.imageio.ImageIO; import javax.inject.Singleton; import javax.swing.BorderFactory; import javax.swing.GroupLayout; @@ -67,19 +65,9 @@ class KourendLibraryPanel extends PluginPanel static { - try - { - synchronized (ImageIO.class) - { - BufferedImage resetIcon = ImageIO.read(KourendLibraryPanel.class.getResourceAsStream("/util/reset.png")); - RESET_ICON = new ImageIcon(resetIcon); - RESET_CLICK_ICON = new ImageIcon(ImageUtil.alphaOffset(resetIcon, -100)); - } - } - catch (IOException e) - { - throw new RuntimeException(e); - } + final BufferedImage resetIcon = ImageUtil.getResourceStreamFromClass(KourendLibraryPanel.class, "/util/reset.png"); + RESET_ICON = new ImageIcon(resetIcon); + RESET_CLICK_ICON = new ImageIcon(ImageUtil.alphaOffset(resetIcon, -100)); } void init() diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPlugin.java index 5c05200c82..d1e31b3ce9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/kourendlibrary/KourendLibraryPlugin.java @@ -29,7 +29,6 @@ import com.google.inject.Provides; import java.awt.image.BufferedImage; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.imageio.ImageIO; import javax.inject.Inject; import javax.swing.SwingUtilities; import lombok.extern.slf4j.Slf4j; @@ -53,6 +52,7 @@ import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.NavigationButton; import net.runelite.client.ui.ClientToolbar; import net.runelite.client.ui.overlay.OverlayManager; +import net.runelite.client.util.ImageUtil; @PluginDescriptor( name = "Kourend Library", @@ -109,11 +109,7 @@ public class KourendLibraryPlugin extends Plugin panel = injector.getInstance(KourendLibraryPanel.class); panel.init(); - BufferedImage icon; - synchronized (ImageIO.class) - { - icon = ImageIO.read(Book.class.getResourceAsStream("panel_icon.png")); - } + final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "panel_icon.png"); navButton = NavigationButton.builder() .tooltip("Kourend Library") diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java index 3817e1a67b..35fe556174 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java @@ -34,7 +34,6 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; -import javax.imageio.ImageIO; import javax.inject.Inject; import javax.swing.SwingUtilities; import lombok.extern.slf4j.Slf4j; @@ -59,6 +58,7 @@ import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.ClientToolbar; import net.runelite.client.ui.NavigationButton; +import net.runelite.client.util.ImageUtil; import net.runelite.client.util.Text; import net.runelite.http.api.item.ItemPrice; @@ -125,11 +125,7 @@ public class LootTrackerPlugin extends Plugin panel = new LootTrackerPanel(itemManager); spriteManager.getSpriteAsync(SpriteID.UNUSED_TAB_INVENTORY, 0, panel::loadHeaderIcon); - final BufferedImage icon; - synchronized (ImageIO.class) - { - icon = ImageIO.read(LootTrackerPanel.class.getResourceAsStream("panel_icon.png")); - } + final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "panel_icon.png"); navButton = NavigationButton.builder() .tooltip("Loot Tracker") diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyRoomTimer.java b/runelite-client/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyRoomTimer.java index 7f4d295aaf..3c85391da8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyRoomTimer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mta/alchemy/AlchemyRoomTimer.java @@ -25,12 +25,11 @@ package net.runelite.client.plugins.mta.alchemy; import java.awt.image.BufferedImage; -import java.io.IOException; import java.time.temporal.ChronoUnit; -import javax.imageio.ImageIO; import lombok.extern.slf4j.Slf4j; import net.runelite.client.plugins.Plugin; import net.runelite.client.ui.overlay.infobox.Timer; +import net.runelite.client.util.ImageUtil; @Slf4j public class AlchemyRoomTimer extends Timer @@ -51,17 +50,7 @@ public class AlchemyRoomTimer extends Timer return image; } - try - { - synchronized (ImageIO.class) - { - image = ImageIO.read(AlchemyRoomTimer.class.getResourceAsStream("/util/reset.png")); - } - } - catch (IOException ex) - { - log.warn(null, ex); - } + image = ImageUtil.getResourceStreamFromClass(AlchemyRoomTimer.class, "/util/reset.png"); return image; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/notes/NotesPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/notes/NotesPlugin.java index e705561b27..fc178db38f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/notes/NotesPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/notes/NotesPlugin.java @@ -27,7 +27,6 @@ package net.runelite.client.plugins.notes; import com.google.common.eventbus.Subscribe; import com.google.inject.Provides; import java.awt.image.BufferedImage; -import javax.imageio.ImageIO; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import net.runelite.api.events.SessionOpen; @@ -36,6 +35,7 @@ import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.NavigationButton; import net.runelite.client.ui.ClientToolbar; +import net.runelite.client.util.ImageUtil; @PluginDescriptor( name = "Notes", @@ -67,11 +67,7 @@ public class NotesPlugin extends Plugin panel = injector.getInstance(NotesPanel.class); panel.init(config); - BufferedImage icon; - synchronized (ImageIO.class) - { - icon = ImageIO.read(getClass().getResourceAsStream("notes_icon.png")); - } + final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "notes_icon.png"); navButton = NavigationButton.builder() .tooltip("Notes") diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohIcons.java b/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohIcons.java index e484621786..fe88c23027 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohIcons.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/poh/PohIcons.java @@ -25,14 +25,13 @@ package net.runelite.client.plugins.poh; import java.awt.image.BufferedImage; -import java.io.IOException; import java.util.HashMap; import java.util.Map; -import javax.imageio.ImageIO; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import static net.runelite.api.ObjectID.*; import static net.runelite.api.NullObjectID.*; +import net.runelite.client.util.ImageUtil; @Slf4j public enum PohIcons @@ -105,17 +104,7 @@ public enum PohIcons return image; } - try - { - synchronized (ImageIO.class) - { - image = ImageIO.read(PohIcons.class.getResourceAsStream(getImageResource() + ".png")); - } - } - catch (IOException ex) - { - log.warn("unable to load image", ex); - } + image = ImageUtil.getResourceStreamFromClass(getClass(), getImageResource() + ".png"); return image; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerPlugin.java index 43b44c3658..4684e258b5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerPlugin.java @@ -39,7 +39,6 @@ import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.imageio.ImageIO; import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; @@ -53,6 +52,7 @@ import net.runelite.client.plugins.screenmarkers.ui.ScreenMarkerPluginPanel; import net.runelite.client.ui.NavigationButton; import net.runelite.client.ui.ClientToolbar; import net.runelite.client.ui.overlay.OverlayManager; +import net.runelite.client.util.ImageUtil; @PluginDescriptor( name = "Screen Markers", @@ -108,11 +108,7 @@ public class ScreenMarkerPlugin extends Plugin pluginPanel = injector.getInstance(ScreenMarkerPluginPanel.class); pluginPanel.rebuild(); - BufferedImage icon; - synchronized (ImageIO.class) - { - icon = ImageIO.read(ScreenMarkerPlugin.class.getResourceAsStream(ICON_FILE)); - } + final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), ICON_FILE); navigationButton = NavigationButton.builder() .tooltip(PLUGIN_NAME) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerCreationPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerCreationPanel.java index 3cc7162752..51567dd2dc 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerCreationPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerCreationPanel.java @@ -30,8 +30,6 @@ import java.awt.GridLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; -import java.io.IOException; -import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; @@ -56,18 +54,8 @@ public class ScreenMarkerCreationPanel extends JPanel static { - try - { - synchronized (ImageIO.class) - { - CONFIRM_ICON = new ImageIcon(ImageIO.read(ScreenMarkerPlugin.class.getResourceAsStream("confirm_icon.png"))); - CANCEL_ICON = new ImageIcon(ImageIO.read(ScreenMarkerPlugin.class.getResourceAsStream("cancel_icon.png"))); - } - } - catch (IOException e) - { - throw new RuntimeException(e); - } + CONFIRM_ICON = new ImageIcon(ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "confirm_icon.png")); + CANCEL_ICON = new ImageIcon(ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "cancel_icon.png")); final BufferedImage confirmIcon = ImageUtil.bufferedImageFromImage(CONFIRM_ICON.getImage()); CONFIRM_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(confirmIcon, 0.54f)); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPanel.java index 0741875188..053fb57613 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPanel.java @@ -34,8 +34,6 @@ import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; -import java.io.IOException; -import javax.imageio.ImageIO; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JColorChooser; @@ -108,48 +106,38 @@ class ScreenMarkerPanel extends JPanel static { - try - { - synchronized (ImageIO.class) - { - BufferedImage borderImg = ImageIO.read(ScreenMarkerPlugin.class.getResourceAsStream("border_color_icon.png")); - BORDER_COLOR_ICON = new ImageIcon(borderImg); - BORDER_COLOR_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(borderImg, -100)); + final BufferedImage borderImg = ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "border_color_icon.png"); + BORDER_COLOR_ICON = new ImageIcon(borderImg); + BORDER_COLOR_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(borderImg, -100)); - BufferedImage noBorderImg = ImageIO.read(ScreenMarkerPlugin.class.getResourceAsStream("no_border_color_icon.png")); - NO_BORDER_COLOR_ICON = new ImageIcon(noBorderImg); - NO_BORDER_COLOR_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(noBorderImg, -100)); + final BufferedImage noBorderImg = ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "no_border_color_icon.png"); + NO_BORDER_COLOR_ICON = new ImageIcon(noBorderImg); + NO_BORDER_COLOR_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(noBorderImg, -100)); - BufferedImage fillImg = ImageIO.read(ScreenMarkerPlugin.class.getResourceAsStream("fill_color_icon.png")); - FILL_COLOR_ICON = new ImageIcon(fillImg); - FILL_COLOR_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(fillImg, -100)); + final BufferedImage fillImg = ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "fill_color_icon.png"); + FILL_COLOR_ICON = new ImageIcon(fillImg); + FILL_COLOR_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(fillImg, -100)); - BufferedImage noFillImg = ImageIO.read(ScreenMarkerPlugin.class.getResourceAsStream("no_fill_color_icon.png")); - NO_FILL_COLOR_ICON = new ImageIcon(noFillImg); - NO_FILL_COLOR_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(noFillImg, -100)); + final BufferedImage noFillImg = ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "no_fill_color_icon.png"); + NO_FILL_COLOR_ICON = new ImageIcon(noFillImg); + NO_FILL_COLOR_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(noFillImg, -100)); - BufferedImage opacityImg = ImageIO.read(ScreenMarkerPlugin.class.getResourceAsStream("opacity_icon.png")); - FULL_OPACITY_ICON = new ImageIcon(opacityImg); - OPACITY_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(opacityImg, -100)); - NO_OPACITY_ICON = new ImageIcon(ImageUtil.alphaOffset(opacityImg, -150)); + final BufferedImage opacityImg = ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "opacity_icon.png"); + FULL_OPACITY_ICON = new ImageIcon(opacityImg); + OPACITY_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(opacityImg, -100)); + NO_OPACITY_ICON = new ImageIcon(ImageUtil.alphaOffset(opacityImg, -150)); - BufferedImage visibleImg = ImageIO.read(ScreenMarkerPlugin.class.getResourceAsStream("visible_icon.png")); - VISIBLE_ICON = new ImageIcon(visibleImg); - VISIBLE_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(visibleImg, -100)); + final BufferedImage visibleImg = ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "visible_icon.png"); + VISIBLE_ICON = new ImageIcon(visibleImg); + VISIBLE_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(visibleImg, -100)); - BufferedImage invisibleImg = ImageIO.read(ScreenMarkerPlugin.class.getResourceAsStream("invisible_icon.png")); - INVISIBLE_ICON = new ImageIcon(invisibleImg); - INVISIBLE_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(invisibleImg, -100)); + final BufferedImage invisibleImg = ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "invisible_icon.png"); + INVISIBLE_ICON = new ImageIcon(invisibleImg); + INVISIBLE_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(invisibleImg, -100)); - BufferedImage deleteImg = ImageIO.read(ScreenMarkerPlugin.class.getResourceAsStream("delete_icon.png")); - DELETE_ICON = new ImageIcon(deleteImg); - DELETE_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(deleteImg, -100)); - } - } - catch (IOException e) - { - throw new RuntimeException(e); - } + final BufferedImage deleteImg = ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "delete_icon.png"); + DELETE_ICON = new ImageIcon(deleteImg); + DELETE_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(deleteImg, -100)); } ScreenMarkerPanel(ScreenMarkerPlugin plugin, ScreenMarkerOverlay marker) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPluginPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPluginPanel.java index 2b58291b28..3e43abaa4d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPluginPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPluginPanel.java @@ -34,8 +34,7 @@ import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.io.IOException; -import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; import javax.swing.Box; import javax.swing.ImageIcon; import javax.swing.JLabel; @@ -81,19 +80,9 @@ public class ScreenMarkerPluginPanel extends PluginPanel static { - try - { - synchronized (ImageIO.class) - { - ADD_ICON = new ImageIcon(ImageIO.read(ScreenMarkerPlugin.class.getResourceAsStream("add_icon.png"))); - } - } - catch (IOException e) - { - throw new RuntimeException(e); - } - - ADD_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(ImageUtil.bufferedImageFromImage(ADD_ICON.getImage()), 0.53f)); + final BufferedImage addIcon = ImageUtil.getResourceStreamFromClass(ScreenMarkerPlugin.class, "add_icon.png"); + ADD_ICON = new ImageIcon(addIcon); + ADD_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(addIcon, 0.53f)); } public void init() diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java index b9e26db8dc..557f19c3c1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java @@ -90,6 +90,7 @@ import net.runelite.client.ui.DrawManager; import net.runelite.client.ui.NavigationButton; import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.util.HotkeyListener; +import net.runelite.client.util.ImageUtil; import net.runelite.client.util.Text; import net.runelite.http.api.RuneLiteAPI; import okhttp3.Call; @@ -205,41 +206,30 @@ public class ScreenshotPlugin extends Plugin SCREENSHOT_DIR.mkdirs(); keyManager.registerKeyListener(hotkeyListener); - try - { - BufferedImage iconImage; - synchronized (ImageIO.class) - { - iconImage = ImageIO.read(ScreenshotPlugin.class.getResourceAsStream("screenshot.png")); - } + final BufferedImage iconImage = ImageUtil.getResourceStreamFromClass(getClass(), "screenshot.png"); - titleBarButton = NavigationButton.builder() - .tab(false) - .tooltip("Take screenshot") - .icon(iconImage) - .onClick(() -> takeScreenshot(format(new Date()))) - .popup(ImmutableMap - .builder() - .put("Open screenshot folder...", () -> + titleBarButton = NavigationButton.builder() + .tab(false) + .tooltip("Take screenshot") + .icon(iconImage) + .onClick(() -> takeScreenshot(format(new Date()))) + .popup(ImmutableMap + .builder() + .put("Open screenshot folder...", () -> + { + try { - try - { - Desktop.getDesktop().open(SCREENSHOT_DIR); - } - catch (IOException ex) - { - log.warn("Error opening screenshot dir", ex); - } - }) - .build()) - .build(); + Desktop.getDesktop().open(SCREENSHOT_DIR); + } + catch (IOException ex) + { + log.warn("Error opening screenshot dir", ex); + } + }) + .build()) + .build(); - clientToolbar.addNavigation(titleBarButton); - } - catch (IOException ex) - { - log.warn("Error adding screenshot button to titlebar", ex); - } + clientToolbar.addNavigation(titleBarButton); } @Override diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java index fe073b7822..7f90d123fb 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/skillcalculator/SkillCalculatorPlugin.java @@ -26,7 +26,6 @@ package net.runelite.client.plugins.skillcalculator; import java.awt.image.BufferedImage; -import javax.imageio.ImageIO; import javax.inject.Inject; import net.runelite.api.Client; import net.runelite.client.game.ItemManager; @@ -37,6 +36,7 @@ import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.ClientUI; import net.runelite.client.ui.NavigationButton; import net.runelite.client.ui.ClientToolbar; +import net.runelite.client.util.ImageUtil; @PluginDescriptor( name = "Skill Calculator", @@ -69,11 +69,7 @@ public class SkillCalculatorPlugin extends Plugin @Override protected void startUp() throws Exception { - BufferedImage icon; - synchronized (ImageIO.class) - { - icon = ImageIO.read(getClass().getResourceAsStream("calc.png")); - } + final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "calc.png"); SkillCalculator.spriteManager = spriteManager; SkillCalculator.itemManager = itemManager; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TeleportPoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TeleportPoint.java index e283bec935..831cda90d1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TeleportPoint.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/TeleportPoint.java @@ -25,10 +25,9 @@ */ package net.runelite.client.plugins.worldmap; -import java.io.IOException; -import javax.imageio.ImageIO; import lombok.Getter; import net.runelite.client.ui.overlay.worldmap.WorldMapPoint; +import net.runelite.client.util.ImageUtil; class TeleportPoint extends WorldMapPoint { @@ -42,13 +41,6 @@ class TeleportPoint extends WorldMapPoint this.data = data; setTooltip(data.getTooltip()); - try - { - setImage(ImageIO.read(WorldMapPlugin.class.getResourceAsStream(data.getIconPath()))); - } - catch (IOException e) - { - throw new RuntimeException(e); - } + setImage(ImageUtil.getResourceStreamFromClass(WorldMapPlugin.class, data.getIconPath())); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java index 8f2e701299..bb60566745 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java @@ -29,9 +29,7 @@ import com.google.common.eventbus.Subscribe; import com.google.inject.Inject; import com.google.inject.Provides; import java.awt.image.BufferedImage; -import java.io.IOException; import java.util.Arrays; -import javax.imageio.ImageIO; import net.runelite.api.Client; import net.runelite.api.Experience; import net.runelite.api.Skill; @@ -41,6 +39,7 @@ import net.runelite.client.config.ConfigManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.overlay.worldmap.WorldMapPointManager; +import net.runelite.client.util.ImageUtil; @PluginDescriptor( name = "World Map", @@ -73,23 +72,13 @@ public class WorldMapPlugin extends Plugin BLANK_ICON = new BufferedImage(iconBufferSize, iconBufferSize, BufferedImage.TYPE_INT_ARGB); - try - { - synchronized (ImageIO.class) - { - FAIRY_TRAVEL_ICON = new BufferedImage(iconBufferSize, iconBufferSize, BufferedImage.TYPE_INT_ARGB); - final BufferedImage icon = ImageIO.read(WorldMapPlugin.class.getResourceAsStream("fairy_ring_travel.png")); - FAIRY_TRAVEL_ICON.getGraphics().drawImage(icon, 1, 1, null); + FAIRY_TRAVEL_ICON = new BufferedImage(iconBufferSize, iconBufferSize, BufferedImage.TYPE_INT_ARGB); + final BufferedImage fairyTravelIcon = ImageUtil.getResourceStreamFromClass(WorldMapPlugin.class, "fairy_ring_travel.png"); + FAIRY_TRAVEL_ICON.getGraphics().drawImage(fairyTravelIcon, 1, 1, null); - NOPE_ICON = new BufferedImage(iconBufferSize, iconBufferSize, BufferedImage.TYPE_INT_ARGB); - final BufferedImage nopeImage = ImageIO.read(WorldMapPlugin.class.getResourceAsStream("nope_icon.png")); - NOPE_ICON.getGraphics().drawImage(nopeImage, 1, 1, null); - } - } - catch (IOException e) - { - throw new RuntimeException(e); - } + NOPE_ICON = new BufferedImage(iconBufferSize, iconBufferSize, BufferedImage.TYPE_INT_ARGB); + final BufferedImage nopeImage = ImageUtil.getResourceStreamFromClass(WorldMapPlugin.class, "nope_icon.png"); + NOPE_ICON.getGraphics().drawImage(nopeImage, 1, 1, null); } @Inject diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java index 32dee4a246..9f13ea9d33 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java @@ -33,7 +33,6 @@ import java.awt.image.BufferedImage; import java.time.temporal.ChronoUnit; import java.util.EnumSet; import java.util.Objects; -import javax.imageio.ImageIO; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; @@ -53,6 +52,7 @@ import static net.runelite.client.plugins.xptracker.XpWorldType.NORMAL; import net.runelite.client.task.Schedule; import net.runelite.client.ui.NavigationButton; import net.runelite.client.ui.ClientToolbar; +import net.runelite.client.util.ImageUtil; import net.runelite.http.api.xp.XpClient; @PluginDescriptor( @@ -102,11 +102,7 @@ public class XpTrackerPlugin extends Plugin { xpPanel = new XpPanel(this, client, skillIconManager); - BufferedImage icon; - synchronized (ImageIO.class) - { - icon = ImageIO.read(getClass().getResourceAsStream("/skill_icons/overall.png")); - } + final BufferedImage icon = ImageUtil.getResourceStreamFromClass(getClass(), "/skill_icons/overall.png"); navButton = NavigationButton.builder() .tooltip("XP Tracker") diff --git a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java index 15882be372..22424d4f74 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java @@ -38,9 +38,7 @@ import java.awt.LayoutManager; import java.awt.Rectangle; import java.awt.TrayIcon; import java.awt.image.BufferedImage; -import java.io.IOException; import javax.annotation.Nullable; -import javax.imageio.ImageIO; import javax.inject.Inject; import javax.inject.Singleton; import javax.swing.BoxLayout; @@ -96,24 +94,8 @@ public class ClientUI static { - BufferedImage icon; - BufferedImage sidebarOpen; - - try - { - synchronized (ImageIO.class) - { - icon = ImageIO.read(ClientUI.class.getResourceAsStream("/runelite.png")); - sidebarOpen = ImageIO.read(ClientUI.class.getResourceAsStream("open.png")); - } - } - catch (IOException e) - { - throw new RuntimeException(e); - } - - ICON = icon; - SIDEBAR_OPEN = sidebarOpen; + ICON = ImageUtil.getResourceStreamFromClass(ClientUI.class, "/runelite.png"); + SIDEBAR_OPEN = ImageUtil.getResourceStreamFromClass(ClientUI.class, "open.png"); SIDEBAR_CLOSE = ImageUtil.flipImage(SIDEBAR_OPEN, true, false); } diff --git a/runelite-client/src/main/java/net/runelite/client/util/ImageUtil.java b/runelite-client/src/main/java/net/runelite/client/util/ImageUtil.java index 22b6d8b671..3d66bef7da 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/ImageUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/util/ImageUtil.java @@ -31,7 +31,9 @@ import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import java.awt.image.RescaleOp; +import java.io.IOException; import java.util.Arrays; +import javax.imageio.ImageIO; import javax.swing.GrayFilter; import java.util.function.Predicate; @@ -328,6 +330,30 @@ public class ImageUtil return outlinedImage; } + /** + * Reads an image resource from a given path relative to a given class. + * This method is primarily shorthand for the synchronization and error handling required for + * loading image resources from classes. + * + * @param c The class to be referenced for resource path. + * @param path The path, relative to the given class. + * @return A {@link BufferedImage} of the loaded image resource from the given path. + */ + public static BufferedImage getResourceStreamFromClass(final Class c, final String path) + { + try + { + synchronized (ImageIO.class) + { + return ImageIO.read(c.getResourceAsStream(path)); + } + } + catch (IOException e) + { + throw new RuntimeException(e); + } + } + /** * Fills all non-transparent pixels of the given image with the given color. *