From 3963785de9572c09548795e18ca8893851c39ef9 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Tue, 17 Jul 2018 19:58:08 -0700 Subject: [PATCH 01/17] resources: Remove unused images This removes the now-unused images left over from the removed special attack orb plugin and plugin rework for new title toolbar. --- .../plugins/screenshot/screenshot_inverted.png | Bin 677 -> 0 bytes .../client/plugins/specorb/special_orb_icon.png | Bin 860 -> 0 bytes .../components/minimap_orb_background.png | Bin 17196 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/screenshot/screenshot_inverted.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/specorb/special_orb_icon.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/ui/overlay/components/minimap_orb_background.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/screenshot/screenshot_inverted.png b/runelite-client/src/main/resources/net/runelite/client/plugins/screenshot/screenshot_inverted.png deleted file mode 100644 index 37a546d5558cbadcc9a6d0f84a9138e389143940..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 677 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-GzZ+Rj;xUkjGiz z5m^kh={g8AI%&+V01C2~c>21sKVlRR*5~>Enmv<&fw9=r#WBR=_|>WVvknDF9Ie+Z z6^(IOBEmISXV(uF*%%j|Ep|}Qv^Z}x%x?dcEJy(r9maDB^-Il{XfBCb7>sXmw`&cWsRvsLUu!Li+| z9h&!UZr&^RP;f)ZtekAm2KGkhO^JtEdYuImDt|Td?ObtMMwV}yUeA}FMcb@h)4bB{ z{6F1FxIeKoCvwxp(zdxFJq-8d0w%YqWwSJy`kuV94vUj;S3q-m9;|g3>8;?urGZj^R(4Q(DROFX!-$O2JPN>Aj3hjA>gs|QYq)6&A%8b zS`5vm%%At~<@SOFEDp0AkMMdh2N>~eDVz|zX}3-3t0zxmy(H7p8xmIVd^R`Y>5V#V zcsHo`=IWfYUj6)fhL3wSgBSQjTHY$GIrQg9`SHEa9u)uC`nTgfm XmtT}V`<;yxP!WTttDnm{r-UW|utfsF diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/specorb/special_orb_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/specorb/special_orb_icon.png deleted file mode 100644 index fbdd8a054648e428fd714c0831e1dbbb4419d345..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 860 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 ttXH;Ht9nJXY Date: Sun, 29 Jul 2018 19:25:45 -0700 Subject: [PATCH 02/17] SwingUtil: Fix grayscaleOffset to not modify alpha With previous code, grayscaleOffset was modifying all image components (including alpha), instead of only the color components. This commit fixes that by using a `RescaleOp` instead, which allows for distinct modifiers per component. --- .../net/runelite/client/util/SwingUtil.java | 52 +++++++++---------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java b/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java index 514b7c4550..47bc06adb6 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java @@ -32,7 +32,6 @@ import java.awt.Frame; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Rectangle; -import java.awt.RenderingHints; import java.awt.SystemTray; import java.awt.Toolkit; import java.awt.TrayIcon; @@ -42,8 +41,8 @@ import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; -import java.awt.image.LookupOp; -import java.awt.image.LookupTable; +import java.awt.image.RescaleOp; +import java.util.Arrays; import java.util.Enumeration; import java.util.concurrent.Callable; import java.util.function.BiConsumer; @@ -111,33 +110,20 @@ public class SwingUtil */ public static BufferedImage grayscaleOffset(BufferedImage image, int offset) { - int numComponents = image.getColorModel().getNumComponents(); - int index = numComponents - 1; + final float offsetFloat = (float) offset; + final int numComponents = image.getColorModel().getNumComponents(); + final float[] scales = new float[numComponents]; + final float[] offsets = new float[numComponents]; - LookupTable lookup = new LookupTable(0, numComponents) + Arrays.fill(scales, 1f); + for (int i = 0; i < numComponents; i++) { - @Override - public int[] lookupPixel(int[] src, int[] dest) - { - if (dest[index] != 0) - { - dest[index] = dest[index] + offset; - if (dest[index] < 0) - { - dest[index] = 0; - } - else if (dest[index] > 255) - { - dest[index] = 255; - } - } + offsets[i] = offsetFloat; + } + // Set alpha to not offset + offsets[numComponents - 1] = 0f; - return dest; - } - }; - - LookupOp op = new LookupOp(lookup, new RenderingHints(null)); - return op.filter(image, null); + return offset(image, scales, offsets); } /** @@ -365,4 +351,16 @@ public class SwingUtil return SubstanceCoreUtilities.getTitlePaneComponent(frame) != null; } + /** + * Performs a rescale operation on the image's color components. + * + * @param image The image to be adjusted. + * @param scales An array of scale operations to be performed on the image's color components. + * @param offsets An array of offset operations to be performed on the image's color components. + * @return The modified image after applying the given adjustments. + */ + private static BufferedImage offset(final BufferedImage image, final float[] scales, final float[] offsets) + { + return new RescaleOp(scales, offsets, null).filter(image, null); + } } From 06cd5cd7d0c111bc7b0bb4ece155f4782de7c7f0 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Sun, 29 Jul 2018 19:37:37 -0700 Subject: [PATCH 03/17] Add image utility class --- .../client/plugins/config/ConfigPanel.java | 4 +- .../client/plugins/config/PluginListItem.java | 4 +- .../kourendlibrary/KourendLibraryPanel.java | 4 +- .../puzzlesolver/PuzzleSolverOverlay.java | 17 +- .../screenmarkers/ui/ScreenMarkerPanel.java | 20 +- .../net/runelite/client/util/ImageUtil.java | 112 +++++++++ .../net/runelite/client/util/SwingUtil.java | 58 +---- .../runelite/client/util/ImageUtilTest.java | 236 ++++++++++++++++++ 8 files changed, 369 insertions(+), 86 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/util/ImageUtil.java create mode 100644 runelite-client/src/test/java/net/runelite/client/util/ImageUtilTest.java 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 632b365611..e5636314f9 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 @@ -89,7 +89,7 @@ import net.runelite.client.ui.PluginPanel; import net.runelite.client.ui.components.ComboBoxListRenderer; import net.runelite.client.ui.components.IconButton; import net.runelite.client.ui.components.IconTextField; -import net.runelite.client.util.SwingUtil; +import net.runelite.client.util.ImageUtil; @Slf4j public class ConfigPanel extends PluginPanel @@ -130,7 +130,7 @@ public class ConfigPanel extends PluginPanel { BufferedImage backIcon = ImageIO.read(ConfigPanel.class.getResourceAsStream("config_back_icon.png")); BACK_ICON = new ImageIcon(backIcon); - BACK_ICON_HOVER = new ImageIcon(SwingUtil.grayscaleOffset(backIcon, -100)); + BACK_ICON_HOVER = new ImageIcon(ImageUtil.grayscaleOffset(backIcon, -100)); SEARCH = new ImageIcon(ImageIO.read(IconTextField.class.getResourceAsStream("search.png"))); } } 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 0514795de1..27b96d2c27 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 @@ -45,7 +45,7 @@ import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.PluginPanel; import net.runelite.client.ui.components.IconButton; -import net.runelite.client.util.SwingUtil; +import net.runelite.client.util.ImageUtil; import org.apache.commons.text.similarity.JaroWinklerDistance; class PluginListItem extends JPanel @@ -98,7 +98,7 @@ class PluginListItem extends JPanel OFF_STAR = new ImageIcon(ImageIO.read(ConfigPanel.class.getResourceAsStream("stars/off.png"))); } - CONFIG_ICON_HOVER = new ImageIcon(SwingUtil.grayscaleOffset(configIcon, -100)); + CONFIG_ICON_HOVER = new ImageIcon(ImageUtil.grayscaleOffset(configIcon, -100)); } catch (IOException e) { 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 33b7edba41..cd66a57229 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 @@ -52,7 +52,7 @@ import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.PluginPanel; -import net.runelite.client.util.SwingUtil; +import net.runelite.client.util.ImageUtil; @Singleton class KourendLibraryPanel extends PluginPanel @@ -73,7 +73,7 @@ class KourendLibraryPanel extends PluginPanel { BufferedImage resetIcon = ImageIO.read(KourendLibraryPanel.class.getResourceAsStream("reset.png")); RESET_ICON = new ImageIcon(resetIcon); - RESET_CLICK_ICON = new ImageIcon(SwingUtil.grayscaleOffset(resetIcon, -100)); + RESET_CLICK_ICON = new ImageIcon(ImageUtil.grayscaleOffset(resetIcon, -100)); } } catch (IOException e) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverOverlay.java index 33b8aff485..cc82f165cf 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverOverlay.java @@ -32,8 +32,6 @@ import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; -import java.awt.geom.AffineTransform; -import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Arrays; @@ -60,6 +58,7 @@ import net.runelite.client.ui.overlay.OverlayPriority; import net.runelite.client.ui.overlay.OverlayUtil; import net.runelite.client.ui.overlay.components.BackgroundComponent; import net.runelite.client.ui.overlay.components.TextComponent; +import net.runelite.client.util.ImageUtil; @Slf4j public class PuzzleSolverOverlay extends Overlay @@ -448,7 +447,7 @@ public class PuzzleSolverOverlay extends Overlay { if (upArrow == null) { - upArrow = getRotatedImage(getDownArrow(), Math.PI); + upArrow = ImageUtil.rotateImage(getDownArrow(), Math.PI); } return upArrow; } @@ -457,7 +456,7 @@ public class PuzzleSolverOverlay extends Overlay { if (leftArrow == null) { - leftArrow = getRotatedImage(getDownArrow(), Math.PI / 2); + leftArrow = ImageUtil.rotateImage(getDownArrow(), Math.PI / 2); } return leftArrow; } @@ -466,16 +465,8 @@ public class PuzzleSolverOverlay extends Overlay { if (rightArrow == null) { - rightArrow = getRotatedImage(getDownArrow(), 3 * Math.PI / 2); + rightArrow = ImageUtil.rotateImage(getDownArrow(), 3 * Math.PI / 2); } return rightArrow; } - - private BufferedImage getRotatedImage(BufferedImage image, double theta) - { - AffineTransform transform = new AffineTransform(); - transform.rotate(theta, image.getWidth() / 2, image.getHeight() / 2); - AffineTransformOp transformOp = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR); - return transformOp.filter(image, null); - } } 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 e7b4d71044..def79500dd 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 @@ -55,7 +55,7 @@ import net.runelite.client.plugins.screenmarkers.ScreenMarkerPlugin; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.components.FlatTextField; -import net.runelite.client.util.SwingUtil; +import net.runelite.client.util.ImageUtil; class ScreenMarkerPanel extends JPanel { @@ -114,36 +114,36 @@ class ScreenMarkerPanel extends JPanel { BufferedImage borderImg = ImageIO.read(ScreenMarkerPlugin.class.getResourceAsStream("border_color_icon.png")); BORDER_COLOR_ICON = new ImageIcon(borderImg); - BORDER_COLOR_HOVER_ICON = new ImageIcon(SwingUtil.grayscaleOffset(borderImg, -100)); + BORDER_COLOR_HOVER_ICON = new ImageIcon(ImageUtil.grayscaleOffset(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(SwingUtil.grayscaleOffset(noBorderImg, -100)); + NO_BORDER_COLOR_HOVER_ICON = new ImageIcon(ImageUtil.grayscaleOffset(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(SwingUtil.grayscaleOffset(fillImg, -100)); + FILL_COLOR_HOVER_ICON = new ImageIcon(ImageUtil.grayscaleOffset(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(SwingUtil.grayscaleOffset(noFillImg, -100)); + NO_FILL_COLOR_HOVER_ICON = new ImageIcon(ImageUtil.grayscaleOffset(noFillImg, -100)); BufferedImage opacityImg = ImageIO.read(ScreenMarkerPlugin.class.getResourceAsStream("opacity_icon.png")); FULL_OPACITY_ICON = new ImageIcon(opacityImg); - OPACITY_HOVER_ICON = new ImageIcon(SwingUtil.grayscaleOffset(opacityImg, -100)); - NO_OPACITY_ICON = new ImageIcon(SwingUtil.grayscaleOffset(opacityImg, -150)); + OPACITY_HOVER_ICON = new ImageIcon(ImageUtil.grayscaleOffset(opacityImg, -100)); + NO_OPACITY_ICON = new ImageIcon(ImageUtil.grayscaleOffset(opacityImg, -150)); BufferedImage visibleImg = ImageIO.read(ScreenMarkerPlugin.class.getResourceAsStream("visible_icon.png")); VISIBLE_ICON = new ImageIcon(visibleImg); - VISIBLE_HOVER_ICON = new ImageIcon(SwingUtil.grayscaleOffset(visibleImg, -100)); + VISIBLE_HOVER_ICON = new ImageIcon(ImageUtil.grayscaleOffset(visibleImg, -100)); BufferedImage invisibleImg = ImageIO.read(ScreenMarkerPlugin.class.getResourceAsStream("invisible_icon.png")); INVISIBLE_ICON = new ImageIcon(invisibleImg); - INVISIBLE_HOVER_ICON = new ImageIcon(SwingUtil.grayscaleOffset(invisibleImg, -100)); + INVISIBLE_HOVER_ICON = new ImageIcon(ImageUtil.grayscaleOffset(invisibleImg, -100)); BufferedImage deleteImg = ImageIO.read(ScreenMarkerPlugin.class.getResourceAsStream("delete_icon.png")); DELETE_ICON = new ImageIcon(deleteImg); - DELETE_HOVER_ICON = new ImageIcon(SwingUtil.grayscaleOffset(deleteImg, -100)); + DELETE_HOVER_ICON = new ImageIcon(ImageUtil.grayscaleOffset(deleteImg, -100)); } } catch (IOException e) 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 new file mode 100644 index 0000000000..c2aa18f999 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/util/ImageUtil.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2018, Jordan Atwood + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.util; + +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.geom.AffineTransform; +import java.awt.image.AffineTransformOp; +import java.awt.image.BufferedImage; +import java.awt.image.RescaleOp; +import java.util.Arrays; + +/** + * Various Image/BufferedImage utilities. + */ +public class ImageUtil +{ + /** + * Offsets an image in the grayscale (darkens/brightens) by a given offset. + * + * @param image The image to be darkened or brightened. + * @param offset A signed 8-bit integer value to brighten or darken the image with. + * Values above 0 will brighten, and values below 0 will darken. + * @return The given image with its brightness adjusted by the given offset. + */ + public static BufferedImage grayscaleOffset(final BufferedImage image, final int offset) + { + final float offsetFloat = (float) offset; + final int numComponents = image.getColorModel().getNumComponents(); + final float[] scales = new float[numComponents]; + final float[] offsets = new float[numComponents]; + + Arrays.fill(scales, 1f); + for (int i = 0; i < numComponents; i++) + { + offsets[i] = offsetFloat; + } + // Set alpha to not offset + offsets[numComponents - 1] = 0f; + + return offset(image, scales, offsets); + } + + /** + * Re-size a BufferedImage to the given dimensions. + * + * @param image the BufferedImage. + * @param newWidth The width to set the BufferedImage to. + * @param newHeight The height to set the BufferedImage to. + * @return The BufferedImage with the specified dimensions + */ + public static BufferedImage resizeImage(final BufferedImage image, final int newWidth, final int newHeight) + { + final Image tmp = image.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH); + final BufferedImage dimg = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB); + + final Graphics2D g2d = dimg.createGraphics(); + g2d.drawImage(tmp, 0, 0, null); + g2d.dispose(); + return dimg; + } + + /** + * Rotates an image around its center by a given number of radians. + * + * @param image The image to be rotated. + * @param theta The number of radians to rotate the image. + * @return The given image, rotated by the given theta. + */ + public static BufferedImage rotateImage(final BufferedImage image, final double theta) + { + AffineTransform transform = new AffineTransform(); + transform.rotate(theta, image.getWidth() / 2.0, image.getHeight() / 2.0); + AffineTransformOp transformOp = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR); + return transformOp.filter(image, null); + } + + /** + * Performs a rescale operation on the image's color components. + * + * @param image The image to be adjusted. + * @param scales An array of scale operations to be performed on the image's color components. + * @param offsets An array of offset operations to be performed on the image's color components. + * @return The modified image after applying the given adjustments. + */ + private static BufferedImage offset(final BufferedImage image, final float[] scales, final float[] offsets) + { + return new RescaleOp(scales, offsets, null).filter(image, null); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java b/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java index 47bc06adb6..e951393709 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java @@ -29,7 +29,6 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Frame; -import java.awt.Graphics2D; import java.awt.Image; import java.awt.Rectangle; import java.awt.SystemTray; @@ -41,8 +40,6 @@ import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; -import java.awt.image.RescaleOp; -import java.util.Arrays; import java.util.Enumeration; import java.util.concurrent.Callable; import java.util.function.BiConsumer; @@ -105,27 +102,6 @@ public class SwingUtil System.setProperty("sun.awt.noerasebackground", "true"); } - /** - * Offsets an image in the grayscale (darkens/brightens) by an offset - */ - public static BufferedImage grayscaleOffset(BufferedImage image, int offset) - { - final float offsetFloat = (float) offset; - final int numComponents = image.getColorModel().getNumComponents(); - final float[] scales = new float[numComponents]; - final float[] offsets = new float[numComponents]; - - Arrays.fill(scales, 1f); - for (int i = 0; i < numComponents; i++) - { - offsets[i] = offsetFloat; - } - // Set alpha to not offset - offsets[numComponents - 1] = 0f; - - return offset(image, scales, offsets); - } - /** * Safely sets Swing theme * @@ -266,25 +242,6 @@ public class SwingUtil }); } - /** - * Re-size a BufferedImage to the given dimensions. - * - * @param image the BufferedImage. - * @param newWidth The width to set the BufferedImage to. - * @param newHeight The height to set the BufferedImage to. - * @return The BufferedImage with the specified dimensions - */ - private static BufferedImage resizeImage(BufferedImage image, int newWidth, int newHeight) - { - final Image tmp = image.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH); - final BufferedImage dimg = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB); - - final Graphics2D g2d = dimg.createGraphics(); - g2d.drawImage(tmp, 0, 0, null); - g2d.dispose(); - return dimg; - } - /** * Create swing button from navigation button. * @@ -300,7 +257,7 @@ public class SwingUtil { final BufferedImage scaledImage = iconSize > 0 - ? resizeImage(navigationButton.getIcon(), iconSize, iconSize) + ? ImageUtil.resizeImage(navigationButton.getIcon(), iconSize, iconSize) : navigationButton.getIcon(); final JButton button = new JButton(); @@ -350,17 +307,4 @@ public class SwingUtil { return SubstanceCoreUtilities.getTitlePaneComponent(frame) != null; } - - /** - * Performs a rescale operation on the image's color components. - * - * @param image The image to be adjusted. - * @param scales An array of scale operations to be performed on the image's color components. - * @param offsets An array of offset operations to be performed on the image's color components. - * @return The modified image after applying the given adjustments. - */ - private static BufferedImage offset(final BufferedImage image, final float[] scales, final float[] offsets) - { - return new RescaleOp(scales, offsets, null).filter(image, null); - } } diff --git a/runelite-client/src/test/java/net/runelite/client/util/ImageUtilTest.java b/runelite-client/src/test/java/net/runelite/client/util/ImageUtilTest.java new file mode 100644 index 0000000000..a1caa7f1ae --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/util/ImageUtilTest.java @@ -0,0 +1,236 @@ +/* + * Copyright (c) 2018, Jordan Atwood + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.util; + +import java.awt.Color; +import static java.awt.Color.BLACK; +import static java.awt.Color.BLUE; +import static java.awt.Color.GRAY; +import static java.awt.Color.GREEN; +import static java.awt.Color.RED; +import static java.awt.Color.WHITE; +import java.awt.image.BufferedImage; +import java.awt.image.DataBuffer; +import java.awt.image.DataBufferInt; +import java.util.Arrays; +import javax.annotation.Nonnull; +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +public class ImageUtilTest +{ + private static final Color BLACK_HALF_TRANSPARENT = new Color(0, 0, 0, 128); + private static final Color BLACK_TRANSPARENT = new Color(0, true); + private static final int CORNER_SIZE = 2; + private static final int CENTERED_SIZE = 3; + + private static final BufferedImage BLACK_PIXEL_TOP_LEFT; + private static final BufferedImage BLACK_PIXEL_TOP_RIGHT; + private static final BufferedImage BLACK_PIXEL_BOTTOM_LEFT; + private static final BufferedImage BLACK_PIXEL_BOTTOM_RIGHT; + + static + { + BLACK_PIXEL_TOP_LEFT = new BufferedImage(CORNER_SIZE, CORNER_SIZE, BufferedImage.TYPE_INT_ARGB); + BLACK_PIXEL_TOP_LEFT.setRGB(0, 0, BLACK.getRGB()); + + BLACK_PIXEL_TOP_RIGHT = new BufferedImage(CORNER_SIZE, CORNER_SIZE, BufferedImage.TYPE_INT_ARGB); + BLACK_PIXEL_TOP_RIGHT.setRGB(1, 0, BLACK.getRGB()); + + BLACK_PIXEL_BOTTOM_LEFT = new BufferedImage(CORNER_SIZE, CORNER_SIZE, BufferedImage.TYPE_INT_ARGB); + BLACK_PIXEL_BOTTOM_LEFT.setRGB(0, 1, BLACK.getRGB()); + + BLACK_PIXEL_BOTTOM_RIGHT = new BufferedImage(CORNER_SIZE, CORNER_SIZE, BufferedImage.TYPE_INT_ARGB); + BLACK_PIXEL_BOTTOM_RIGHT.setRGB(1, 1, BLACK.getRGB()); + } + + @Test + public void grayscaleOffset() + { + assert(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.grayscaleOffset(oneByOne(BLACK), -255))); + assert(bufferedImagesEqual(oneByOne(new Color(50, 50, 50)), ImageUtil.grayscaleOffset(oneByOne(BLACK), 50))); + assert(bufferedImagesEqual(oneByOne(GRAY), ImageUtil.grayscaleOffset(oneByOne(BLACK), 128))); + assert(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.grayscaleOffset(oneByOne(GRAY), -255))); + assert(bufferedImagesEqual(oneByOne(WHITE), ImageUtil.grayscaleOffset(oneByOne(BLACK), 255))); + assert(bufferedImagesEqual(oneByOne(new Color(200, 200, 200)), ImageUtil.grayscaleOffset(oneByOne(WHITE), -55))); + assert(bufferedImagesEqual(oneByOne(WHITE), ImageUtil.grayscaleOffset(oneByOne(WHITE), 55))); + } + + @Test + public void resizeImage() + { + // TODO: test image contents after changing size + + final BufferedImage larger = ImageUtil.resizeImage(oneByOne(BLACK), 46, 46); + final BufferedImage smaller = ImageUtil.resizeImage(centeredPixel(WHITE), 1, 1); + final BufferedImage stretched = ImageUtil.resizeImage(solidColor(30, 30, RED), 12, 34); + + assertEquals(46, larger.getWidth()); + assertEquals(46, larger.getHeight()); + assertEquals(1, smaller.getWidth()); + assertEquals(1, smaller.getHeight()); + assertEquals(12, stretched.getWidth()); + assertEquals(34, stretched.getHeight()); + + final BufferedImage[] assertSameAfterResize = new BufferedImage[] { + oneByOne(WHITE), + oneByOne(GRAY), + oneByOne(BLACK), + oneByOne(RED), + oneByOne(GREEN), + oneByOne(BLUE), + oneByOne(BLACK_HALF_TRANSPARENT), + oneByOne(BLACK_TRANSPARENT), + centeredPixel(WHITE), + centeredPixel(GRAY), + centeredPixel(BLACK), + BLACK_PIXEL_TOP_LEFT, + BLACK_PIXEL_TOP_RIGHT, + BLACK_PIXEL_BOTTOM_LEFT, + BLACK_PIXEL_BOTTOM_RIGHT, + }; + for (BufferedImage image : assertSameAfterResize) + { + assert(bufferedImagesEqual(image, ImageUtil.resizeImage(image, image.getWidth(), image.getHeight()))); + } + } + + @Test + public void rotateImage() + { + // TODO: Test more than 90° rotations + + // Evenly-sized images (2x2) + assert(bufferedImagesEqual(BLACK_PIXEL_TOP_RIGHT, ImageUtil.rotateImage(BLACK_PIXEL_TOP_LEFT, Math.PI / 2))); + assert(bufferedImagesEqual(BLACK_PIXEL_BOTTOM_RIGHT, ImageUtil.rotateImage(BLACK_PIXEL_TOP_LEFT, Math.PI))); + assert(bufferedImagesEqual(BLACK_PIXEL_BOTTOM_LEFT, ImageUtil.rotateImage(BLACK_PIXEL_TOP_LEFT, Math.PI * 3 / 2))); + assert(bufferedImagesEqual(BLACK_PIXEL_TOP_LEFT, ImageUtil.rotateImage(BLACK_PIXEL_TOP_LEFT, Math.PI * 2))); + + // Unevenly-sized images (2x1); when rotated 90° become (2x2) images + final BufferedImage twoByOneLeft = new BufferedImage(2, 1, BufferedImage.TYPE_INT_ARGB); + twoByOneLeft.setRGB(0, 0, BLACK.getRGB()); + final BufferedImage twoByTwoRight = new BufferedImage(2, 1, BufferedImage.TYPE_INT_ARGB); + twoByTwoRight.setRGB(1, 0, BLACK.getRGB()); + final BufferedImage oneByTwoTop = new BufferedImage(2, 2, BufferedImage.TYPE_INT_ARGB); + oneByTwoTop.setRGB(1, 0, new Color(0, 0, 0, 127).getRGB()); + final BufferedImage oneByTwoBottom = new BufferedImage(2, 2, BufferedImage.TYPE_INT_ARGB); + oneByTwoBottom.setRGB(0, 0, new Color(0, 0, 0, 127).getRGB()); + oneByTwoBottom.setRGB(0, 1, BLACK.getRGB()); + + assert(bufferedImagesEqual(oneByTwoTop, ImageUtil.rotateImage(twoByOneLeft, Math.PI / 2))); + assert(bufferedImagesEqual(twoByTwoRight, ImageUtil.rotateImage(twoByOneLeft, Math.PI))); + assert(bufferedImagesEqual(oneByTwoBottom, ImageUtil.rotateImage(twoByOneLeft, Math.PI * 3 / 2))); + assert(bufferedImagesEqual(twoByOneLeft, ImageUtil.rotateImage(twoByOneLeft, Math.PI * 2))); + } + + /** + * Compares whether two {@link BufferedImage}s are equal in data. + * + * @param expected The first {@link BufferedImage} to be compared. + * @param actual The second {@link BufferedImage} to be compared. + * @return A boolean indicating whether the given {@link BufferedImage}s are of the same image data. + */ + private boolean bufferedImagesEqual(final @Nonnull BufferedImage expected, final @Nonnull BufferedImage actual) + { + if (expected.getWidth() != actual.getWidth()) + { + return false; + } + + if (!expected.getColorModel().equals(actual.getColorModel())) + { + return false; + } + + final DataBuffer aBuffer = expected.getRaster().getDataBuffer(); + final DataBuffer bBuffer = actual.getRaster().getDataBuffer(); + final DataBufferInt aBufferInt = (DataBufferInt) aBuffer; + final DataBufferInt bBufferInt = (DataBufferInt) bBuffer; + + if (aBufferInt.getNumBanks() != bBufferInt.getNumBanks()) + { + return false; + } + + for (int i = 0; i < aBufferInt.getNumBanks(); i++) + { + final int[] aDataBank = aBufferInt.getData(i); + final int[] bDataBank = bBufferInt.getData(i); + if (!Arrays.equals(aDataBank, bDataBank)) + { + return false; + } + } + + return true; + } + + /** + * Creates a {@link BufferedImage} of a 1-by-1px image of the given color. + * + * @param color The color to use for the image's single pixel. + * @return A {@link BufferedImage} containing a single pixel of the given color. + */ + private BufferedImage oneByOne(final @Nonnull Color color) + { + return solidColor(1, 1, color); + } + + /** + * Creates a {@link BufferedImage} of a single pixel of the given color centered in a 3-by-3px + * image. + * + * @param color The color to use for the centered pixel. + * @return A {@link BufferedImage} with completely transparent pixels and one pixel of the + * given color in the center. + */ + private BufferedImage centeredPixel(final @Nonnull Color color) + { + final BufferedImage out = new BufferedImage(CENTERED_SIZE, CENTERED_SIZE, BufferedImage.TYPE_INT_ARGB); + out.setRGB(1, 1, color.getRGB()); + return out; + } + + /** + * Creates a {@link BufferedImage} of a solid color of given width and height. + * + * @param width The desired width of the color image. + * @param height The desired height of the color image. + * @param color The desired color of the image. + * @return A {@link BufferedImage} of given dimensions filled with the given color. + */ + private BufferedImage solidColor(final int width, final int height, final @Nonnull Color color) + { + final BufferedImage out = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + for (int x = 0; x < width; x++) + { + for (int y = 0; y < height; y++) + { + out.setRGB(x, y, color.getRGB()); + } + } + return out; + } +} From 8fb36d3ea4ece0135a7217a93ef760a475d695dc Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Sun, 29 Jul 2018 19:14:14 -0700 Subject: [PATCH 04/17] resources: Remove derivative images This commit adds `ImageUtil::bufferedImageFromImage`, `ImageUtil::alphaOffset`, `ImageUtil::grayscaleImage`, and `ImageUtil::flipImage` functions and applies them to client and plugin code to remove unneeded derivative images from the resources directory. --- .../client/plugins/config/ConfigPanel.java | 2 +- .../client/plugins/config/PluginListItem.java | 18 ++- .../grandexchange/GrandExchangeOfferSlot.java | 5 +- .../GrandExchangeSearchPanel.java | 3 +- .../client/plugins/info/InfoPanel.java | 2 +- .../kourendlibrary/KourendLibraryPanel.java | 2 +- .../ui/ScreenMarkerCreationPanel.java | 10 +- .../screenmarkers/ui/ScreenMarkerPanel.java | 18 +-- .../ui/ScreenMarkerPluginPanel.java | 4 +- .../java/net/runelite/client/ui/ClientUI.java | 5 +- .../net/runelite/client/util/ImageUtil.java | 146 +++++++++++++++++- .../config/{stars/on.png => star_on.png} | Bin .../client/plugins/config/stars/off.png | Bin 654 -> 0 bytes .../{switchers/on.png => switcher_on.png} | Bin .../client/plugins/config/switchers/off.png | Bin 15659 -> 0 bytes .../plugins/grandexchange/arrow_left.png | Bin 15918 -> 0 bytes .../plugins/grandexchange/arrow_right.png | Bin 15917 -> 0 bytes .../plugins/screenmarkers/add_hover_icon.png | Bin 15845 -> 0 bytes .../screenmarkers/cancel_hover_icon.png | Bin 16152 -> 0 bytes .../screenmarkers/confirm_hover_icon.png | Bin 15951 -> 0 bytes .../screenmarkers/confirm_locked_icon.png | Bin 15950 -> 0 bytes .../net/runelite/client/ui/close.png | Bin 242 -> 0 bytes .../client/ui/components/search_darker.png | Bin 16280 -> 0 bytes .../plugins/info => util}/arrow_right.png | Bin .../runelite/client/util/ImageUtilTest.java | 111 +++++++++++++ 25 files changed, 292 insertions(+), 34 deletions(-) rename runelite-client/src/main/resources/net/runelite/client/plugins/config/{stars/on.png => star_on.png} (100%) delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/config/stars/off.png rename runelite-client/src/main/resources/net/runelite/client/plugins/config/{switchers/on.png => switcher_on.png} (100%) delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/config/switchers/off.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/arrow_left.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/arrow_right.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/add_hover_icon.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/cancel_hover_icon.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/confirm_hover_icon.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/confirm_locked_icon.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/ui/close.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/ui/components/search_darker.png rename runelite-client/src/main/resources/{net/runelite/client/plugins/info => util}/arrow_right.png (100%) 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 e5636314f9..49dc527f3d 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 @@ -130,7 +130,7 @@ public class ConfigPanel extends PluginPanel { BufferedImage backIcon = ImageIO.read(ConfigPanel.class.getResourceAsStream("config_back_icon.png")); BACK_ICON = new ImageIcon(backIcon); - BACK_ICON_HOVER = new ImageIcon(ImageUtil.grayscaleOffset(backIcon, -100)); + BACK_ICON_HOVER = new ImageIcon(ImageUtil.alphaOffset(backIcon, -100)); SEARCH = new ImageIcon(ImageIO.read(IconTextField.class.getResourceAsStream("search.png"))); } } 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 27b96d2c27..b9ba675b80 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 @@ -92,13 +92,21 @@ class PluginListItem extends JPanel { configIcon = ImageIO.read(ConfigPanel.class.getResourceAsStream("config_edit_icon.png")); CONFIG_ICON = new ImageIcon(configIcon); - ON_SWITCHER = new ImageIcon(ImageIO.read(ConfigPanel.class.getResourceAsStream("switchers/on.png"))); - OFF_SWITCHER = new ImageIcon(ImageIO.read(ConfigPanel.class.getResourceAsStream("switchers/off.png"))); - ON_STAR = new ImageIcon(ImageIO.read(ConfigPanel.class.getResourceAsStream("stars/on.png"))); - OFF_STAR = new ImageIcon(ImageIO.read(ConfigPanel.class.getResourceAsStream("stars/off.png"))); + ON_SWITCHER = new ImageIcon(ImageIO.read(ConfigPanel.class.getResourceAsStream("switcher_on.png"))); + ON_STAR = new ImageIcon(ImageIO.read(ConfigPanel.class.getResourceAsStream("star_on.png"))); } - CONFIG_ICON_HOVER = new ImageIcon(ImageUtil.grayscaleOffset(configIcon, -100)); + 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) { 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 356d6f843c..45fdbe5371 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 @@ -54,6 +54,7 @@ import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.components.ThinProgressBar; import net.runelite.client.util.ColorUtil; +import net.runelite.client.util.ImageUtil; import net.runelite.client.util.StackFormatter; @Slf4j @@ -87,8 +88,8 @@ public class GrandExchangeOfferSlot extends JPanel { synchronized (ImageIO.class) { - RIGHT_ARROW_ICON = new ImageIcon(ImageIO.read(GrandExchangeOfferSlot.class.getResourceAsStream("arrow_right.png"))); - LEFT_ARROW_ICON = new ImageIcon(ImageIO.read(GrandExchangeOfferSlot.class.getResourceAsStream("arrow_left.png"))); + 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) 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 05e92315c4..2cf3eca92d 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 @@ -49,6 +49,7 @@ import net.runelite.client.game.ItemManager; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.components.IconTextField; import net.runelite.client.ui.components.PluginErrorPanel; +import net.runelite.client.util.ImageUtil; import net.runelite.http.api.item.Item; import net.runelite.http.api.item.ItemPrice; import net.runelite.http.api.item.SearchResult; @@ -99,7 +100,7 @@ class GrandExchangeSearchPanel extends JPanel { synchronized (ImageIO.class) { - SEARCH_ICON = new ImageIcon(ImageIO.read(IconTextField.class.getResourceAsStream("search_darker.png"))); + 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"))); } 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 7415591e34..6309d289d0 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 @@ -96,7 +96,7 @@ public class InfoPanel extends PluginPanel { synchronized (ImageIO.class) { - ARROW_RIGHT_ICON = new ImageIcon(ImageIO.read(InfoPanel.class.getResourceAsStream("arrow_right.png"))); + 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"))); 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 cd66a57229..3dcf7e6542 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 @@ -73,7 +73,7 @@ class KourendLibraryPanel extends PluginPanel { BufferedImage resetIcon = ImageIO.read(KourendLibraryPanel.class.getResourceAsStream("reset.png")); RESET_ICON = new ImageIcon(resetIcon); - RESET_CLICK_ICON = new ImageIcon(ImageUtil.grayscaleOffset(resetIcon, -100)); + RESET_CLICK_ICON = new ImageIcon(ImageUtil.alphaOffset(resetIcon, -100)); } } catch (IOException e) 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 6385fa3163..3cc7162752 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 @@ -29,6 +29,7 @@ import java.awt.Color; 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; @@ -39,6 +40,7 @@ import net.runelite.client.plugins.screenmarkers.ScreenMarkerPlugin; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.components.shadowlabel.JShadowedLabel; +import net.runelite.client.util.ImageUtil; public class ScreenMarkerCreationPanel extends JPanel { @@ -59,16 +61,18 @@ public class ScreenMarkerCreationPanel extends JPanel synchronized (ImageIO.class) { CONFIRM_ICON = new ImageIcon(ImageIO.read(ScreenMarkerPlugin.class.getResourceAsStream("confirm_icon.png"))); - CONFIRM_HOVER_ICON = new ImageIcon(ImageIO.read(ScreenMarkerPlugin.class.getResourceAsStream("confirm_hover_icon.png"))); - CONFIRM_LOCKED_ICON = new ImageIcon(ImageIO.read(ScreenMarkerPlugin.class.getResourceAsStream("confirm_locked_icon.png"))); CANCEL_ICON = new ImageIcon(ImageIO.read(ScreenMarkerPlugin.class.getResourceAsStream("cancel_icon.png"))); - CANCEL_HOVER_ICON = new ImageIcon(ImageIO.read(ScreenMarkerPlugin.class.getResourceAsStream("cancel_hover_icon.png"))); } } catch (IOException e) { throw new RuntimeException(e); } + + final BufferedImage confirmIcon = ImageUtil.bufferedImageFromImage(CONFIRM_ICON.getImage()); + CONFIRM_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(confirmIcon, 0.54f)); + CONFIRM_LOCKED_ICON = new ImageIcon(ImageUtil.grayscaleImage(confirmIcon)); + CANCEL_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(ImageUtil.bufferedImageFromImage(CANCEL_ICON.getImage()), 0.6f)); } ScreenMarkerCreationPanel(ScreenMarkerPlugin plugin) 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 def79500dd..0741875188 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 @@ -114,36 +114,36 @@ class ScreenMarkerPanel extends JPanel { BufferedImage borderImg = ImageIO.read(ScreenMarkerPlugin.class.getResourceAsStream("border_color_icon.png")); BORDER_COLOR_ICON = new ImageIcon(borderImg); - BORDER_COLOR_HOVER_ICON = new ImageIcon(ImageUtil.grayscaleOffset(borderImg, -100)); + 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.grayscaleOffset(noBorderImg, -100)); + 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.grayscaleOffset(fillImg, -100)); + 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.grayscaleOffset(noFillImg, -100)); + 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.grayscaleOffset(opacityImg, -100)); - NO_OPACITY_ICON = new ImageIcon(ImageUtil.grayscaleOffset(opacityImg, -150)); + 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.grayscaleOffset(visibleImg, -100)); + 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.grayscaleOffset(invisibleImg, -100)); + 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.grayscaleOffset(deleteImg, -100)); + DELETE_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(deleteImg, -100)); } } catch (IOException e) 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 9dca4e8d11..2b58291b28 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 @@ -47,6 +47,7 @@ import net.runelite.client.plugins.screenmarkers.ScreenMarkerPlugin; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.PluginPanel; import net.runelite.client.ui.components.PluginErrorPanel; +import net.runelite.client.util.ImageUtil; @Singleton public class ScreenMarkerPluginPanel extends PluginPanel @@ -85,13 +86,14 @@ public class ScreenMarkerPluginPanel extends PluginPanel synchronized (ImageIO.class) { ADD_ICON = new ImageIcon(ImageIO.read(ScreenMarkerPlugin.class.getResourceAsStream("add_icon.png"))); - ADD_HOVER_ICON = new ImageIcon(ImageIO.read(ScreenMarkerPlugin.class.getResourceAsStream("add_hover_icon.png"))); } } catch (IOException e) { throw new RuntimeException(e); } + + ADD_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(ImageUtil.bufferedImageFromImage(ADD_ICON.getImage()), 0.53f)); } public void init() 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 0539517a65..15882be372 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 @@ -70,6 +70,7 @@ import net.runelite.client.events.NavigationButtonAdded; import net.runelite.client.events.NavigationButtonRemoved; import net.runelite.client.input.KeyManager; import net.runelite.client.ui.skin.SubstanceRuneLiteLookAndFeel; +import net.runelite.client.util.ImageUtil; import net.runelite.client.util.OSType; import net.runelite.client.util.OSXUtil; import net.runelite.client.util.SwingUtil; @@ -97,7 +98,6 @@ public class ClientUI { BufferedImage icon; BufferedImage sidebarOpen; - BufferedImage sidebarClose; try { @@ -105,7 +105,6 @@ public class ClientUI { icon = ImageIO.read(ClientUI.class.getResourceAsStream("/runelite.png")); sidebarOpen = ImageIO.read(ClientUI.class.getResourceAsStream("open.png")); - sidebarClose = ImageIO.read(ClientUI.class.getResourceAsStream("close.png")); } } catch (IOException e) @@ -115,7 +114,7 @@ public class ClientUI ICON = icon; SIDEBAR_OPEN = sidebarOpen; - SIDEBAR_CLOSE = sidebarClose; + SIDEBAR_CLOSE = ImageUtil.flipImage(SIDEBAR_OPEN, true, false); } @Getter 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 c2aa18f999..13828dad52 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,12 +31,33 @@ import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import java.awt.image.RescaleOp; import java.util.Arrays; +import javax.swing.GrayFilter; /** * Various Image/BufferedImage utilities. */ public class ImageUtil { + /** + * Creates a {@link BufferedImage} from an {@link Image}. + * + * @param image An Image to be converted to a BufferedImage. + * @return A BufferedImage instance of the same given image. + */ + public static BufferedImage bufferedImageFromImage(final Image image) + { + if (image instanceof BufferedImage) + { + return (BufferedImage) image; + } + + final BufferedImage out = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB); + final Graphics2D g2d = out.createGraphics(); + g2d.drawImage(image, 0, 0, null); + g2d.dispose(); + return out; + } + /** * Offsets an image in the grayscale (darkens/brightens) by a given offset. * @@ -63,6 +84,86 @@ public class ImageUtil return offset(image, scales, offsets); } + /** + * Offsets an image in the grayscale (darkens/brightens) by a given percentage. + * + * @param image The image to be darkened or brightened. + * @param percentage The ratio to darken or brighten the given image. + * Values above 1 will brighten, and values below 1 will darken. + * @return The given image with its brightness scaled by the given percentage. + */ + public static BufferedImage grayscaleOffset(final BufferedImage image, final float percentage) + { + final int numComponents = image.getColorModel().getNumComponents(); + final float[] scales = new float[numComponents]; + final float[] offsets = new float[numComponents]; + + Arrays.fill(offsets, 0f); + for (int i = 0; i < numComponents; i++) + { + scales[i] = percentage; + } + // Set alpha to not scale + scales[numComponents - 1] = 1f; + + return offset(image, scales, offsets); + } + + /** + * Offsets an image's alpha component by a given offset. + * + * @param image The image to be made more or less transparent. + * @param offset A signed 8-bit integer value to modify the image's alpha component with. + * Values above 0 will increase transparency, and values below 0 will decrease + * transparency. + * @return The given image with its alpha component adjusted by the given offset. + */ + public static BufferedImage alphaOffset(final BufferedImage image, final int offset) + { + final float offsetFloat = (float) offset; + final int numComponents = image.getColorModel().getNumComponents(); + final float[] scales = new float[numComponents]; + final float[] offsets = new float[numComponents]; + + Arrays.fill(scales, 1f); + Arrays.fill(offsets, 0f); + offsets[numComponents - 1] = offsetFloat; + return offset(image, scales, offsets); + } + + /** + * Offsets an image's alpha component by a given percentage. + * + * @param image The image to be made more or less transparent. + * @param percentage The ratio to modify the image's alpha component with. + * Values above 1 will increase transparency, and values below 1 will decrease + * transparency. + * @return The given image with its alpha component scaled by the given percentage. + */ + public static BufferedImage alphaOffset(final BufferedImage image, final float percentage) + { + final int numComponents = image.getColorModel().getNumComponents(); + final float[] scales = new float[numComponents]; + final float[] offsets = new float[numComponents]; + + Arrays.fill(scales, 1f); + Arrays.fill(offsets, 0f); + scales[numComponents - 1] = percentage; + return offset(image, scales, offsets); + } + + /** + * Creates a grayscale image from the given image. + * + * @param image The source image to be converted. + * @return A copy of the given imnage, with colors converted to grayscale. + */ + public static BufferedImage grayscaleImage(final BufferedImage image) + { + final Image grayImage = GrayFilter.createDisabledImage(image); + return ImageUtil.bufferedImageFromImage(grayImage); + } + /** * Re-size a BufferedImage to the given dimensions. * @@ -73,13 +174,8 @@ public class ImageUtil */ public static BufferedImage resizeImage(final BufferedImage image, final int newWidth, final int newHeight) { - final Image tmp = image.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH); - final BufferedImage dimg = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB); - - final Graphics2D g2d = dimg.createGraphics(); - g2d.drawImage(tmp, 0, 0, null); - g2d.dispose(); - return dimg; + final Image resized = image.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH); + return ImageUtil.bufferedImageFromImage(resized); } /** @@ -97,6 +193,42 @@ public class ImageUtil return transformOp.filter(image, null); } + /** + * Flips an image horizontally and/or vertically. + * + * @param image The image to be flipped. + * @param horizontal Whether the image should be flipped horizontally. + * @param vertical Whether the image should be flipped vertically. + * @return The given image, flipped horizontally and/or vertically. + */ + public static BufferedImage flipImage(final BufferedImage image, final boolean horizontal, final boolean vertical) + { + int x = 0; + int y = 0; + int w = image.getWidth(); + int h = image.getHeight(); + + final BufferedImage out = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); + final Graphics2D g2d = out.createGraphics(); + + if (horizontal) + { + x = w; + w *= -1; + } + + if (vertical) + { + y = h; + h *= -1; + } + + g2d.drawImage(image, x, y, w, h, null); + g2d.dispose(); + + return out; + } + /** * Performs a rescale operation on the image's color components. * diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/config/stars/on.png b/runelite-client/src/main/resources/net/runelite/client/plugins/config/star_on.png similarity index 100% rename from runelite-client/src/main/resources/net/runelite/client/plugins/config/stars/on.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/config/star_on.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/config/stars/off.png b/runelite-client/src/main/resources/net/runelite/client/plugins/config/stars/off.png deleted file mode 100644 index b030162e0c70a0cd7e4efb1de6d6f58700c9f20f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 654 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@TGqFnVW(M3hAM`dB6B=jtV<?;Zqle1Gx6p~WYGxKbf-tXS8q>!0ns}yePYv5bpoSKp8QB{;0T;&&% zT$P<{nWAKG$7NGt1vDTxwIorYA~z?m*s8)-32d$vkPQ;nS5g2gDap1~as*kZ5aAo3 z;GAESs$i;TrkiYNVx(Yhsb^?rU}!BPbD z|2&z5_rS3G=jq}YV$pl{@_s#6M}gxX`9G?QEGl&Mb^62E>7nvSRArvS(g&<_oE9or z+B8JfHoG{z=M<5;c)?3WidD30v-!XNE1U{~P)i|M;+e0i#c%@a>8F8gN_ zhu)7ak2gPvcfQM7cG`MZ2#*PCXD*NK7HcP-UHm7Hvn??9d9aO(MLyzSEbkM=D|?P4 zUEOfMFphcGq2NfL*#Akq8Ed_K8ka5p5m`8AhiAQT0JpcIUC^GDk#8Obe|#S{yJ1>k nujQM^+Aq|*?633fJN=ejuueHNA@;Q>C>eRW`njxgN@xNAjIQoC diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/config/switchers/on.png b/runelite-client/src/main/resources/net/runelite/client/plugins/config/switcher_on.png similarity index 100% rename from runelite-client/src/main/resources/net/runelite/client/plugins/config/switchers/on.png rename to runelite-client/src/main/resources/net/runelite/client/plugins/config/switcher_on.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/config/switchers/off.png b/runelite-client/src/main/resources/net/runelite/client/plugins/config/switchers/off.png deleted file mode 100644 index ff25cc611a7c1dc7e0c79ae35183214f93ba534a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15659 zcmeI3e{dA#8OJvQg3(|E9h6Z#52}H1x4U<_+}(0H@>3J#AY4*Buw~fWeJ@#aw|m^} zkxNKv5YbqbS{hr&7DXT^N|>aIE!CD-Gf`k#v<5>pRfIt-lsXQjX!()8dw01XZ<2R1 zQ~OWny_vh)=Y8Jq^X~h3pZD4KpM9))@jW@&GqWj*%BiX>cfbq{ZUVDgN{{XGYk z2CFY!HB`L%^s(GKHf)&k+}{S@J{fxJrK6D-`F1|H;fT!r`FxB0V()b|)O**w+Ar^& zN*$lG>Fc*n4QBBa<25XJTot6QR`W`eWPw(@lffDGkb4lHmrNOWH4(dCk+%k zsE(EYpo{0edpRd>?!dW{7Rq<{d<*kAWq$VulbDFQE9=23&RzGr8pA6;166PQV&YF6 zvj8_!3@w~G{pmYj-oD-V)X?M}@9&SwT&VNGrv z-V<9sJ$1YRF7*B zCny0UFDhPOj0S>`H$^!XMuWW2092h9)JbxY{>wM^>vfV?q`%+dVqC#8P%l+Bhd@p9 z;##4(L9mPZh0bh8l!E~RK;?DOfL{)C(IR~;E(fo*W?HX{bx|9N^d;JWI*+SbSEhu3 z&SESy2uz_>XSEwyi`80Sov$-7tc7OGw3#uO%v=G(6_|91kKUOLuN)!K$GOYzP7DXF zB7ME8205B;Y-}_(nvF`Rj%Mw4JI$DAlgR*k7{X1m%0~@ycy>I7&^Z3MMZ$&lj*?;W{cS?`s@a?$QDA7z-F+stY8pW zU}da6o84rO(}V-11sgHYl8^-J67Nszqs>KxgRvG?uosFpL!pTg3_h{I2Pedu4HmY* z%X)1#Yk@@=p35j(sm9cpj#LdQQ~XNErHH_3cF?0W zkE((P%VFwKz=#xpAIbQdcX@m6?tgvVAod2St1MUut# z+q_84=-Z5n#3F+rK=3BPh3A8K2`&T(-Xys2d=M|eg#f{u1Q(tU;w88cAb6AD!t+7A z1Q!AXZxUR1K8Tm#LV(~+f(y?F@e*7J5WGon;rSq5f(rqHHwi90AH+*=AwcjZ!G-68 zcnK~92;L;P@O%(2!G!?9n*Ggqz>3?Sf-mbbRplkM(U1Dui|*?!&VA(hocG<#mWO&jpY!y_WB(dB z+U7ku)YWyv57%$p8+q+l)80RLuus1%d-K*EkNx5M;VDLGu&et(N&Clh^0F6O7o7Xk zgmc~7=HIvO<6E!v4E}cd#4O5vFlW_dPiN_`d-xkGW}NumTp)bLTz6O5ysxslE}qw0!|?78}pp4+zWKD*g1FQNJa*Lu2pceYMimGew@=@ab5z-3FH|MeYqkq`*cjnB#ooA=rmfd!HXV-`S?r?40J8R8L3%W|%-FF2}I}R%=+@Gvpn?J|( z!R(IyeXh>-AKm)SKH2kG-LdTGtFvY^Z6~6KFI+x)?#;+RWGz*()bZrq+Yik@v}ygL z#&^D!+RpE9X!)wg@!kYq{?JX)-50p3&0m&WIY0RumU^!Cft{BgUD~g`j9XQ)xO`9P Hs)zmq-qc~w diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/arrow_left.png b/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/arrow_left.png deleted file mode 100644 index 480358e6a1c6da1f527110a7605402f6b162c0ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15918 zcmeI3e^?Xe9l*~g(kbdzYO63?jZvqRCU=(*Le3Dx1SMNz`4KBns$A|aa2j$k2@ud> zk+#;^R%@-)U#Qz~6RWOWwR38rDz3UJ57kFIZHHL!*TmXci>=P=y@dSW1@7^A+CBT{ z?s<~C@B96A_j%v%_q~5^dFHH{BcgvEjUdPfQ-(1coFCzTLk5HYdw-kpIXDegtcCOxlwST-%39B!f9)MR9r`L74@*JT;2RA3y~ zjC{s4KONXeYTQ+6OqQ*3#`2|G>+9>6QopRqZkX<57MkWe-d$QW*Hx93R+VKn&5s7g zr+@koIOf*gdnBs+$S1legJkwYPu9Hh@sy}vT8`}qqPUdt7j5vGt8HEUVnC9Wd$0A zzcl$b8`i8}W3ZgIR5jG)JonqVJ7eD2{=4RFw=))PK575r$%9jVogj&;S@QDAS6?5q z8((M7XV%(pP^4o!-CT70{P*=IMw}m6HnnTc)K5w`UO9cOpfmfz`WvGzkG&Cd;c92+ zwXQ4FhZyU-;+>~FtTBOL(ysb z&V!cjt<{ZLyN~VGHZs%ywQX-gSKHM3{nz)uxrkVF_V)8#K2;X8x}{@v{H<+uZ-2|a zeEsQ`y!tMaTFxCUJ%6V0AAfv5 z-gWDUeDYr0@xi&Q1MaR}qZh6D_Gs6JJ-%~k?S|@QcUNvqIqLrWuCe==>JJqs?`+!S zyzyyN>x!7#O9fTV*`4`kZr|2?_|NzDeX;oR>6EQ^TYt7zxA^X7_e@`&QnfVCn|QFG z`&##yl^^7^rQ9#P^KSd8@6dnGyVcm`8-G)E_3YYI`;rOwci#7nLk1s`o*44`HLVCj zpsXd=lWTsOptuqRNpn_4;Vp53ib4=ws@F+U3mA{o$`rAV6xmn%8)Z_KPLa(~n=!M~ zz!b9?l`bZya+ZavTtI1QS*ku-=OsXZ62?PHy(M;soA9Q{{Ba3z%@3n8so%u2AVrqO zCzR%zGo=R3#YokPBsqm8X`~vh0#|D^iJGURN(@({m}73C@g=PE*RtyYU-N>r(o0}Hvk!r>vka)*0DAV@Hd zk#SQl*6Cq6hm?;?TDekBicH2Q3LQPqRpJaKa=3fg0g9-XbfUNdL;G{0sgRGe)MfYI z8cm^$ohe})9yjpA`}K1MyI9D*SIUrjz{Frq%;x@`gZEof(r;?FC%p_H=t0^mZP3$g zscT@;gE1|DTXe^2jWZQ;r36^Yjjc<+pt9l(v(1l;^fAuvNa@T`Qv#gHD( zW#KrxKCsHd8v)n{_*EsHGKY20T)8`5hr%x5`3^^8jHHLr1J7hRmMF*77ED8^wS-EY zfZ+s&MFa_0LNUx7&DtvZ#7HJEHKEo-#)zIlxN!lZ9_-CO(GL6zO9gFj~m-}Iv)%{Aby1Vz&Xl`8HZ4X215C*1`gupY@Tw`#iSL174jg> zBM`N>8ysGT^4p1>{U1z(n=Jcb)9_$b^+TosYI6U-X$Y@ks+e>XF|-~HF5uw6gUwuE zK6_VIuv+_8qK@C+2vEgfMUnpM0e!U3SU7XQK9{dXd#T@Eqr||0;{1P)Yor=>%@cNw zRKu=e&)E*vqX#|6f1}WFgcrXF2X=@Y@V?0ClhkUJT8F~Jutz5AW$d{|7W82^-%s%5 z9v@iIuVdaojuDC;$G}uYyxI9{Ffa<<8^J3p8hU5#Q=XwN_G4azpXkSo3dItWKtO~= z5tlF@NGsxkfC!5sE@3{9R>TDX5f(*U!h9gDhzkNDEQ+{<`9N9`7X(CD6mbdjfwUqn z2#ByK;u7WqX+>NR5MfcoCCmrXint&k!lH;vm=B~CaX~P5f=nRSQK#y^MSM?E(nOQDB=?418GHE5D;Ne z#3jrJ(u%ksAi|=EOPCL&6>&j8ghdgTFds-O;(~w(iy|&zK9E+#1pyHjMO?ysAgzcC z0wOF5;))J`1Xs-`J#p{OFqA4Md9!vvB*Tp X%)ui*+c=T`TGf<3%eZTL;nM#Ctaa;x diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/arrow_right.png b/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/arrow_right.png deleted file mode 100644 index 63ab23f273cfcdbd6ff203ecf37900db0eb23d00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15917 zcmeI3dvw#*8NkJH(m^QQ3@yZC1!G_(q_!kK;#fEi!4AZ24S5(yXn4r7oCs{o*iPaE z76>V&^Z|@g(((wUBWyr{wF5dz8G#a37?4pout7T>O?Zs}9fi=r@UHB{c5V_K&S`h{ zk93YLefN7wzk9#$>K`r69zU*6!p{>B1nFbWGUbAEU+&j44*Wm-^VqMzsh20Kz=t5c z`*FV>$f`Ao2qH>kjK=KjV%E?4idm1;Y&1$eUe>`lX#@$JrDn{iy>RtX(~)8I_1W3h z+@?WIi4w7-uD-Ii>aD8xs<>kazWa~$xU_x|ca5f_@AMGO-E*k^i~9O{Pr;cJ4Ts;U zQrE94%(fl?1M{n@_Kz68GZnaA>@5-*E6U9oy+k7FNs*{JE4MUs-GjR>&03}cIra6t9jTrzV+ZyeY{aL@rjYuuYEBh{=3^5uMHXPWpX61G;lZh{;_4B|GxUyOYt|p zeg5sFlQxI=vZ8ydj${3=-_sh;=h(l?h3+>XEJ zoI#g~3EJpD-AUv?%JCimMsb92!t=hnT} z*7a5Ua<(7duG>eC`RB%6$t~wc)$O^l=j}PfoHKW)wggo<^zz20dG*Fi zjRkdo7;s#d-r6{~B|fM3r~xg74`*)rPPwkRBspc<+>fW&-fBF1sN~$~eSiPmjwJ7$ zgYxHg;qFh)=6vRB**0L#ihGAzR__d+&A4c+TJ&J)nzTc{uO66M537D#e*FI0wVs<_ z#-DgYTywdw(lfDn%IUjzwSW4@$Gg9td*xKx`UfX|x>7&)!QUR5zd5ODY?wZ5Z(-~8 z)`3eu$vdC+XvY1IE}r}z{nzw6`&xoSZmX`HS()yfH}uigN5R2J+yUvao*P!2KoA0D ztoiZY_i6JSv*F% zn8~W}(s>o*tyIM0+-6`{rmwNl!4$P5YKO7FEh zh+Naywsb&BlNI~@9s)(n%E}aFDh2B;LUEl=hhj=psgwf?xv$*qCj)Y~Z)iA3dmIz( zqr8mA&#-PO7niiLCH^#-j7tkV=V|X^5%&%$BkFDwgE_HSx^`~AUze-P)INV^DL~MMv_sl}dl%ZWcy`OPJC#ORsPSfqZ(*dR%H%=3F3oV844C%qM5=Jjg`dP1) zWu1obDvNFeU?1RCm2|{p#%*WId`Wr~c8Sh+G#YIp{j>pirpht39M@PeEuqm7Dorwm z6Brf~By0)Au&{Q$j7dz0&|)Rb zZl9lYQ?%J+00Rn!u@iP&n`%=kZE{-Wu*q?oS|cY(wOX!G*(jTaN~P>7Dl`ukORRgR z&?c5D;R+6f4)-QIOM&pwCsR>Mt&L8_zAm2d1&>?3mI4V24q35vEhB zEXD^Ge0fYEfN}^m$2@v=$I*6$lL<9B59#&MTnVSi+G{w{6(dcL^9i*Af~2_iXrQxC@ZGjd=(lF6|(9+h>vyn%SbPsQ3O`V<1~+O z)Q)a&cs_owqzx$=jY^|O;bGV#n+ed)d=mruu#f8}cxsyu ztmx9QpgYGHMVn)Is$$;kLNyp31@DdEl@*P=vvw-aNEiDtFQQNMV@8Ey2}vLz{Gx!1 zpAV!Ja6v%$MFAH-A4n_Uf`IUg0xo_&kXFD20pS+~T>N|>t$+&x!Y>NA`1wFu0T%>> zUlefh^MSMiE(i#}DB$Af18D_Z5Dvd7_(cI1KOaad z;DUhgivliwK9E+x1p(m~1zh}mAgzE40>Uo}xcK=%S^*aXgkKbJ@$-SS0xk#$zbN41 z=L2a4To4d`QNYE|2hs|-ARzprfQz3Gq!n;MK=?%g7e60JE8v2F@QVU2em;;^zy$%} z7kP0dM85*1-Qd&DGVqP(1kKS8!S|t3Dl6B5AQi(AWPUY*d>;hos|b?Y6Y23xKKQh> z20;d}XQm8Z25hZnQ-(Eg)^@*fbfWUf4YG|vWl+*9sqdp(x2F%xlYFX>IFDdc=VwY% z79IId+5PPcr;G2*`#g9rnE7qefe+%QiYE=f`g&aO9656TjwPxnk$q diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/add_hover_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/add_hover_icon.png deleted file mode 100644 index 9eb7fe3baa3af0e9cb5ddf933f842503ab45f5da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15845 zcmeI3X>8m?6vro&qXbe_Py|#QW;v7|UfXMX4|lUonk^)VZI>iKTBNF8dp0rMwO!lk zZbGRl3P{{VoZ^z8TrIQ$aR`a4P*hRzfwL4)IaCDY<^!q#afI>SJ4r^BC_+fH(ysT- zoBtcnZ{9rHAAD_k$$4$9vs(cGZM{9oK6ISnf2SXbeoyaV-$93??Ve>W0LL8fe_O!a z_nrhmOW5e{PN#=0&vJ(?o9XTDW^BjG8aW6+@#C#GJ$3$$^sLUeu77Y}dfwry?c%NN z?azI?a_2+r;+aqEK4aGh4?S?caoma(yVqT{>C&T4EWEOP*M)ZakHf}0SAYBY%riD@ zn125^dv|>4y!zOOBaf=LsWVsYHkEe|td0Ht`mz1s?W3Q5-+Xok*mu@VzrMPE-eI4Q zzPD{b+h04^-Zi)Fg7rU`w_VN5?Hph9=t?J^TwZT z?Q{10+_e^D-#W0C{|bn2TyX?H;%#oZtXJt9da0j%{0`Xr!aaxI5?p{Y1qFI#r`cYlc6_P@FJ)0=0m9~_&%yem4e|FgL_-1pi3eLIUM z&#=_7zGps}_xwleum0}AtrtJ=;t{`m!EN8U^v|!CFUKu$plDV;sOnY* z28($c@dhBiuxP8=D(Ep8IAoX|fuCM@CBPVZN8l1U#i#6UIBfKcIk10h$$&PtN{i`% zg^AX9Q9%Ln&{LUWK4-d0u_I85tDygWGZ$b=UA$Etfi8bQW-ygzx-ADXaxlzld^o~H zVnIQUM5M@kCd3Oe$BUfEvmsHDctr{^l}{kiivGnNJ*)I3&#erHtd792=h+I!6$*u5 zK@3{X5GTZ9F^&&$p%9CDuj(t=foh-1 zyz+K!Ak(d|Lln89YI8!6=cW*)Qe;^^KdI977Oz2PQkmJL1G)pFHst!CYmGP>T)YOF z-kFn~gs#=%*dtD^#7EaSn1gvFanZ>Olb(WI-Dov=(`nS)Q_kKqvh~Gj()yk$Ww2;W zA@eW0a=8cpOVNvZDtT zrQWkSMk=NBny#ms8thFb(A|RuEv6Rl{k7V_X6pcw?wKl{gVI~aK zW4I`rMjNsWM;t#&?KdQIaI0F)InS;>lIW7b`7BnIhdVUj@m54 z!^b(lR_Ba=VIf>~%|BZPLE^QIl ztPQK?5Y!V~b!OFu|I^AHTs`~;8wjub|J?>UWGh$RiOn^!TFNKZ(73KCStY=HSe)Z_Ka+Z^_beKRDe6r?ARp`+mU4AmC6rH~F7BTJUt}u$O{`Dvg z-5SF9cP9$EOrVmbmddjb=O(n_{RjPWpBpLlkA!&i;ROG;B5icz(q&|6qZ^mjl^2ugUY{!Qc6tw(cL~wgk@Qj;~d_ME7C?0<_41ny3o7+1xt`B8r(6daM@JC z21i9$&Zvg_@=}p6x1zg#^uWQ@o;W7d|Jr5pQ2wdU=uk$*V$ne`AY_x`BJ;t#6c+}B zY*JigKA4x{!hn!Xii^w#^HN+G5VA>ek@;X=iVFimHYqMLAIwW}VL-?x#YN_Wc_}Uo z2-&2#$b2v_#f1SOn-mwB59Xz~Fd$@;;v)0Gyc8D(gltk=WImXe;=+KCO^S=m2lG-~ z7!a~aagq68UWy9?LN+NbG9S!KabZBnCdEbOgLx?~3<%kzxX64kFU5rcA)6EznGfcr zxG*4Olj0)t!Mqd~283)JkWGq<%m?#QTo@3tNyOD!e}@;E=*8UvdP8?z z*D3d*w|g0_r!NJ-*x3NA-vGdG-hM>Y2oifJ2rm;ujyY99KGhk8;jCwvo>D0Yfp6csnXliQRngTY2W}e?dK;~u6_=g Opm*_-?G#0I#0H~DcmZSRG@w+_;$ z;blo~aEnP%?^|krTc~e7ww$6`d}<_;NQ~;1ZjS0XM=TO?a{qr09@ ze6at;FFkQ7(YttOuJF~Ko}a$H{p6GM`mU$Xu6*J5Pwu}Xc~Kez5+_lf1~^nFhaTxj{8 zpq}dwQQzJ62GhUl)LR`rtIk~=*i9)fUfa$7nev>vx0M~Y4z=uv3CZ+xL-Y^64r0%K zYw;tYj{%`uHr947{n{s=I&i@C@Z3$uQ@=c~3C7_aTRwN?P0x|bzq;_pFLzCiOs?5F z5E#Dv>gtES{p#gQCkr3x)WylnY$WWOI-=)U7S#L}?6Ijuc3%TA%Z8&mMC+RJqT&nUAyaTm+1& zgOdgrn%p=nO^!)H*||2{9x4dXK^9n|qma#Lrcmf}7X1qFzun9@9mOuzSf6vi9?&ro zPdFmF0UW%`M@y{F@9+m*Zr<Kx^i0B_|a>QD91jnzK}0 zbJ%{xls<0tIi2=E)lYd{*<5uX%`CHn6q$mUW85y5S->bB$D3udO)X7p{Vq6@^2(YH zXbw;00Fwl!K5j^0{Vt$cw>6uDELHvF#*Ivok1R1D1G3P>gp+qSokFg1(5mJQ)2ON! zT)m|#wasa;wKWTxfr7e#nXM_A6+@x4Lm?P{Lc{=~r5nS#o(Y$ttd=HVmawDB(X(0A zWIb=L3NffjZNF>YKvc9q7+MBsmWRPO%=!g4Cvbc(>lRqH&Pk~!;v)`YUluJ9_2Lc+ zUXS2u@Y2v1^`pzGGI3pAYCRi$#N$FtGc8e*Kr9-DYj>%tEO?Zl+avh`v|9o}Iw*S; zIsj4unoCJOMfA8uS(1y3Y&4(eI;ucq#+cIh!}oCPRgJNzBysvDYHQ!4$7o=KP$Wb}Mih9P9PbDL?O_ zfjcGgK3Vbu2~>t?;%44ZgQ^LmX`(L5V5}80&k)$z*jiC!)M5t7iG~U6gW2b-oXl#< zsb&=0rg*>wQL=MSShB+xK->+jwP{r?%Vz5Q?Yuq&CI5Bi3y+Z>1sX2=ORkE&7ItFl zij@})Fp!23ay=)r2OD9EyWZJ0$PxfvDHx!ATtJ~^8Ac*JOFSL$ z1UZHE@sjB0D%<=n--cQgOQWKe26C9GtgO=TZrZu)%ZKma0HK-x|960H*v^$sVq;FM z{ zo#cjfjvjbd7=YEk=B2J%Q#X}TGXP7cT@lR2lvAt->%??pt4+6@pqdv%o|Re7EBRnS z#XcML!lTdL+~L6gnc~k;X@4Cj9Mhr0?3R+ zRe1km+I86NE!&`qriNPJAfL9_%H0t7D-TzEc+mf%8w;6;K9&j-;GTnG@n zNO0l#AX4T@FKy5=YwboE(8c(B)IT=5G}!l0Ktm{7oHEICAbhE zcoB=Mz4mG{(BS*XdHCY-spK66_|mdN8cfD1YVs2lH8o99|DJ=_S&B-wQ7s=Dp(x=| zidv?h+j{H6u(m z^~x@8X#c^3)7x)8+8X&yu&{w`Q)YV4gJo;>oc{csS6*&4yP`A72M)Ea*!OgL>51eQ z?pe7c)yj{(@x#Zv^}WyR>Ad=#;O2{qK6=Zs_q^?zdGO4&#!pS?2MId$=+6~Bo6 f{od|>%uy@yh1u5*_1|v4c^zB7F?wX(_C5avjhnx~ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/confirm_hover_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/screenmarkers/confirm_hover_icon.png deleted file mode 100644 index e5b719965807d8ea42a5758b5d6995652f3612b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15951 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 z zplb+b$hqvyLeyFr8a~82wK}E!4;I3bH-5ThP!#~YN-)6qgg}x}RhWsg2kxqXCnzL2 zpQy-wp|s4O@nxuFu`(>{LqH9)rJ0o)K1(ZiZuRg}ZlLPQ|Nq-S=WXQ*JF&JVmg?;6 z8X8g+DQTE#*$!)Ic?hr>eJI3M8Y|fns+=AXBW0K|Lj_@YNYrbttAc+GdJF#yibW^B zVj0~E?+OF(^shvz>Q)uTxjT{IF#$`KoG;IOh@I7j_8)M{eQGq{-!E|R#q!Q)QCjUr zrGt2BwHuXIlsD;`9fqYPf1yZomCCt=lJZRZ;N3n5`$W+Lk9o8iRrG2(kQ#_;@SwMx z1B(w7HK?PmaBwbRm7^#uWK`9CdA`UOTH#$k{KLVP|8dN!|K(%yeEz7+=zK;+Vv#`* zAb6AD!t+7A1Q!AXZxUR1K8Tm#LV(~+f(y?F@e*7J5WGon;rSq5f(rqHHwi90AH+*= zAwcjZ!G-68cnK~92;L;P@O%(2!G!?9n* z*IYRX`+mPC+SQ*s_VOEhnoNXHtM+`i_@hI`{9x9{2d zr)`bgyld`w*rR@7^zd`@xy9MWcT>-Ay-VA3%P?aQtCIk-rFM@cev91o|b5G mPwl1;{Qf(B{0sgQ#=rN1O6cZmt8V}u$KdJe=d#Wzp$Pyg3Sg`N diff --git a/runelite-client/src/main/resources/net/runelite/client/ui/components/search_darker.png b/runelite-client/src/main/resources/net/runelite/client/ui/components/search_darker.png deleted file mode 100644 index 0d5d4608a6159a00069e0ec95c70b7dba1bdbeaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16280 zcmeI3e{dAl9l$pT0;yp#AP5ZA<4_62z1{o0w_c8fyJ%uLIFnct+F{t+eU~iU-7a^V zntu!5lRxy2hzwhPphH2?^ zoY|YX+xx!n`+mRsKJWX!@9iJ^sBhuDMTOG~34$o9uJY8t>lFB%I_^gJ`_+M>Z^6rW zxvC*b5Z{=jehY}L+olpkflYL~eZD41k)lnKtgCjrb#g=sh(SOQu@85zf91ZzzMIRB zKi=8zD;>Q;jy+XU^4iBs`<^E&i(fu9^XU7}@4Qc(xMazxRS$Q4XY4Jl2fL5nFZ;e6 zHB`Rh<8#F`*Q^=0<1c3ppN|}R@q^}F+$OGg`Kd7b-e)TvU-aHoOT0V&)sx|0Od$Gi zUw`G$K-W2haVMp)VJTYxPqx0I6L== z?Pmx2`(o23NL+i(zTcO=@!O8I7dv-EEEh!*;tuA?w5uC)n-bsi+53$m+33ifVz6GPv@2*KxZ}B zNS?OYb#{lrXtmod_PcZ@+GwR{Gi9bplbN;9ti_~De)O(F_|F*;0&I=vo@6*EmFb%l zMP@0gwYAmIYBorbM#|`LI4IggnM@??K}Orc3Kt{8(OC&6DL)<%W8D$JDN>|Pl7g;8mSxHWtP*Ng=}I0H!-CWro#UiX zlgxZ)ya5lV02j1mNZLXg={h6BniMS->W1tT!pInrX{0;I)gF_H`~ z_({QG;(>!VT0nq_4>H$$m}`&3H>-I7T_+a4Ao0+BI;~im30O@wBTbrlU?Yu2z>t0# zI7m*g1c1ZB0A5JYgn_c04GXj=BEq`F1+)67V-a95zs1U18H=BUzYaK8mH_GS3k=Bs z4ls<>Y_mG7sj=j7Gb~h<7=_u?mX&2N*W#6@7Oco^O(}w6yn@JFBns4pS*A~|%yh{~ zR}|GIzQ9?IS8I=pSJM{=PAaE0b6aW4q?tH;Irs@cRTw60h^~xyIa9m07av0H35vN9v&VzG zU#Gyc0VxvV6qgv{8UZDT8=X|9F$;it=wjjS2P-ib-*t>mYFHcEzh2$Ng3a;%b`uRh zlu`Xnnr5p}(+0e0wi-3fSUwOI6_+U)4QbA@Qcs3#JgI8oLkw`)tX4DJ@zG|~!Y9T+ zu-+rW^Gj6ShfOe2+y+(THEhT-v}7A*DUybXDb9M_h$mN~6+XGl12wv21;rSq1 z4Hp6gFKW2(d=RaM3ju-`HC%W;h*rae0KtnIE<7JZtKmX`;6)7=o)4nca3MhOqJ|64 z2hnP{5FmI_!-eOAXf<325WJ}2!t+728ZHC~Ues{m`5;;i7Xkz?YPj%x5Uqv_0fHAb zTzEc+R>Oq=!HXI$JRd}>;X;7mMGY6852Dp@Awck=h6~RJ(Q3F5Ab3&3h3A84HCzY~ zyr|*A^Fg#4E(8c(#NsN!FD>i%sv0jrwBJDx9cu{UpF{9^ zfgoze5e1X$34;AGLEIvpUVPgI`1bfs)t-vF*oU8-e7kh*{WHd1I{wt3T8iqcN~Zko zS4+EB`{iRT#|(oo>wCvIKw_-y6jIX`5Mj~dwf zNaH7+Gu91msia<$w@w}bxmQu@%v@v~#|Z2iohlatm>sXOrUm7%Vo eyDwcNh&9jt=JkVbj8@VE?+3J!<> diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/info/arrow_right.png b/runelite-client/src/main/resources/util/arrow_right.png similarity index 100% rename from runelite-client/src/main/resources/net/runelite/client/plugins/info/arrow_right.png rename to runelite-client/src/main/resources/util/arrow_right.png diff --git a/runelite-client/src/test/java/net/runelite/client/util/ImageUtilTest.java b/runelite-client/src/test/java/net/runelite/client/util/ImageUtilTest.java index a1caa7f1ae..1156557160 100644 --- a/runelite-client/src/test/java/net/runelite/client/util/ImageUtilTest.java +++ b/runelite-client/src/test/java/net/runelite/client/util/ImageUtilTest.java @@ -36,6 +36,7 @@ import java.awt.image.DataBuffer; import java.awt.image.DataBufferInt; import java.util.Arrays; import javax.annotation.Nonnull; +import org.apache.commons.lang3.ArrayUtils; import static org.junit.Assert.assertEquals; import org.junit.Test; @@ -66,9 +67,17 @@ public class ImageUtilTest BLACK_PIXEL_BOTTOM_RIGHT.setRGB(1, 1, BLACK.getRGB()); } + @Test + public void bufferedImageFromImage() + { + final BufferedImage buffered = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); + assertEquals(buffered, ImageUtil.bufferedImageFromImage(buffered)); + } + @Test public void grayscaleOffset() { + // grayscaleOffset(BufferedImage image, int offset) assert(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.grayscaleOffset(oneByOne(BLACK), -255))); assert(bufferedImagesEqual(oneByOne(new Color(50, 50, 50)), ImageUtil.grayscaleOffset(oneByOne(BLACK), 50))); assert(bufferedImagesEqual(oneByOne(GRAY), ImageUtil.grayscaleOffset(oneByOne(BLACK), 128))); @@ -76,6 +85,73 @@ public class ImageUtilTest assert(bufferedImagesEqual(oneByOne(WHITE), ImageUtil.grayscaleOffset(oneByOne(BLACK), 255))); assert(bufferedImagesEqual(oneByOne(new Color(200, 200, 200)), ImageUtil.grayscaleOffset(oneByOne(WHITE), -55))); assert(bufferedImagesEqual(oneByOne(WHITE), ImageUtil.grayscaleOffset(oneByOne(WHITE), 55))); + + // grayscaleOffset(BufferedImage image, float percentage) + assert(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.grayscaleOffset(oneByOne(BLACK), 0f))); + assert(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.grayscaleOffset(oneByOne(BLACK), 1f))); + assert(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.grayscaleOffset(oneByOne(BLACK), 2f))); + assert(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.grayscaleOffset(oneByOne(GRAY), 0f))); + assert(bufferedImagesEqual(oneByOne(GRAY), ImageUtil.grayscaleOffset(oneByOne(GRAY), 1f))); + assert(bufferedImagesEqual(oneByOne(WHITE), ImageUtil.grayscaleOffset(oneByOne(GRAY), 2f))); + assert(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.grayscaleOffset(oneByOne(WHITE), 0f))); + assert(bufferedImagesEqual(oneByOne(GRAY), ImageUtil.grayscaleOffset(oneByOne(WHITE), 0.503f))); // grayscaleOffset does Math.floor + assert(bufferedImagesEqual(oneByOne(WHITE), ImageUtil.grayscaleOffset(oneByOne(WHITE), 1f))); + assert(bufferedImagesEqual(oneByOne(WHITE), ImageUtil.grayscaleOffset(oneByOne(WHITE), 2f))); + } + + @Test + public void alphaOffset() + { + // alphaOffset(BufferedImage image, int offset) + assert(bufferedImagesEqual(oneByOne(BLACK_TRANSPARENT), ImageUtil.alphaOffset(oneByOne(BLACK_TRANSPARENT), -255))); + assert(bufferedImagesEqual(oneByOne(new Color(0, 0, 0, 50)), ImageUtil.alphaOffset(oneByOne(BLACK_TRANSPARENT), 50))); + assert(bufferedImagesEqual(oneByOne(BLACK_HALF_TRANSPARENT), ImageUtil.alphaOffset(oneByOne(BLACK_TRANSPARENT), 128))); + assert(bufferedImagesEqual(oneByOne(BLACK_TRANSPARENT), ImageUtil.alphaOffset(oneByOne(BLACK_HALF_TRANSPARENT), -255))); + assert(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.alphaOffset(oneByOne(BLACK_TRANSPARENT), 255))); + assert(bufferedImagesEqual(oneByOne(new Color(0, 0, 0, 200)), ImageUtil.alphaOffset(oneByOne(BLACK), -55))); + assert(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.alphaOffset(oneByOne(BLACK), 255))); + + // alphaOffset(BufferedImage image, float offset) + assert(bufferedImagesEqual(oneByOne(BLACK_TRANSPARENT), ImageUtil.alphaOffset(oneByOne(BLACK_TRANSPARENT), 0f))); + assert(bufferedImagesEqual(oneByOne(BLACK_TRANSPARENT), ImageUtil.alphaOffset(oneByOne(BLACK_TRANSPARENT), 1f))); + assert(bufferedImagesEqual(oneByOne(BLACK_TRANSPARENT), ImageUtil.alphaOffset(oneByOne(BLACK_TRANSPARENT), 2f))); + assert(bufferedImagesEqual(oneByOne(BLACK_TRANSPARENT), ImageUtil.alphaOffset(oneByOne(BLACK_HALF_TRANSPARENT), 0f))); + assert(bufferedImagesEqual(oneByOne(BLACK_HALF_TRANSPARENT), ImageUtil.alphaOffset(oneByOne(BLACK_HALF_TRANSPARENT), 1f))); + assert(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.alphaOffset(oneByOne(BLACK_HALF_TRANSPARENT), 2f))); + assert(bufferedImagesEqual(oneByOne(BLACK_TRANSPARENT), ImageUtil.alphaOffset(oneByOne(BLACK), 0f))); + assert(bufferedImagesEqual(oneByOne(BLACK_HALF_TRANSPARENT), ImageUtil.alphaOffset(oneByOne(BLACK), 0.503f))); // opacityOffset does Math.floor + assert(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.alphaOffset(oneByOne(BLACK), 1f))); + assert(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.alphaOffset(oneByOne(BLACK), 2f))); + } + + @Test + public void grayscaleImage() + { + final BufferedImage[] grayscaleColors = new BufferedImage[] { + oneByOne(WHITE), + oneByOne(GRAY), + oneByOne(BLACK), + oneByOne(BLACK_HALF_TRANSPARENT), + oneByOne(BLACK_TRANSPARENT), + }; + final BufferedImage[] nonGrayscaleColors = new BufferedImage[] { + oneByOne(RED), + oneByOne(GREEN), + oneByOne(BLUE), + }; + + for (BufferedImage image : grayscaleColors) + { + assert(isGrayscale(image)); + } + for (BufferedImage image : nonGrayscaleColors) + { + assert(!isGrayscale(image)); + } + for (BufferedImage image : ArrayUtils.addAll(grayscaleColors, nonGrayscaleColors)) + { + assert(isGrayscale(ImageUtil.grayscaleImage(image))); + } } @Test @@ -145,6 +221,15 @@ public class ImageUtilTest assert(bufferedImagesEqual(twoByOneLeft, ImageUtil.rotateImage(twoByOneLeft, Math.PI * 2))); } + @Test + public void flipImage() + { + assert(bufferedImagesEqual(BLACK_PIXEL_TOP_LEFT, ImageUtil.flipImage(BLACK_PIXEL_TOP_LEFT, false, false))); + assert(bufferedImagesEqual(BLACK_PIXEL_TOP_RIGHT, ImageUtil.flipImage(BLACK_PIXEL_TOP_LEFT, true, false))); + assert(bufferedImagesEqual(BLACK_PIXEL_BOTTOM_LEFT, ImageUtil.flipImage(BLACK_PIXEL_TOP_LEFT, false, true))); + assert(bufferedImagesEqual(BLACK_PIXEL_BOTTOM_RIGHT, ImageUtil.flipImage(BLACK_PIXEL_TOP_LEFT, true, true))); + } + /** * Compares whether two {@link BufferedImage}s are equal in data. * @@ -187,6 +272,32 @@ public class ImageUtilTest return true; } + /** + * Returns whether a {@link BufferedImage} contains only grayscale pixel data. + * + * @param image The image to be checked. + * @return A boolean indicating whether all of the given image's pixels are grayscale. + */ + private boolean isGrayscale(final @Nonnull BufferedImage image) + { + for (int x = 0; x < image.getWidth(); x++) + { + for (int y = 0; y < image.getHeight(); y++) + { + final int color = image.getRGB(x, y); + final int red = (color & 0xff0000) >> 16; + final int green = (color & 0xff00) >> 8; + final int blue = color & 0xff; + if (red != green + || green != blue) + { + return false; + } + } + } + return true; + } + /** * Creates a {@link BufferedImage} of a 1-by-1px image of the given color. * From d6e465877ee7c1dbfbcc9a4ddf5046e035e8df70 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Sun, 29 Jul 2018 19:38:23 -0700 Subject: [PATCH 05/17] clan manager: Use Sprite IDs for rank badges This commit adds `ImageUtil::resizeCanvas`, `ImageUtil::outlineImage`, and `ImageUtil::fillImage`, and applies these functions to the clan manager to replace the clan rank images with calls to `SpriteManager`. --- .../net/runelite/client/game/ClanManager.java | 89 +++++------ .../net/runelite/client/util/ColorUtil.java | 10 ++ .../net/runelite/client/util/ImageUtil.java | 140 ++++++++++++++++++ .../client/game/Captain_clan_rank.png | Bin 2986 -> 0 bytes .../client/game/Corporal_clan_rank.png | Bin 2854 -> 0 bytes .../runelite/client/game/Friend_clan_rank.png | Bin 2944 -> 0 bytes .../client/game/General_clan_rank.png | Bin 2997 -> 0 bytes .../runelite/client/game/JMod_clan_rank.png | Bin 205 -> 0 bytes .../client/game/Lieutenant_clan_rank.png | Bin 2965 -> 0 bytes .../runelite/client/game/Owner_clan_rank.png | Bin 2893 -> 0 bytes .../client/game/Recruit_clan_rank.png | Bin 2845 -> 0 bytes .../client/game/Sergeant_clan_rank.png | Bin 2869 -> 0 bytes .../runelite/client/util/ColorUtilTest.java | 22 +++ .../runelite/client/util/ImageUtilTest.java | 90 +++++++++++ 14 files changed, 303 insertions(+), 48 deletions(-) delete mode 100644 runelite-client/src/main/resources/net/runelite/client/game/Captain_clan_rank.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/game/Corporal_clan_rank.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/game/Friend_clan_rank.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/game/General_clan_rank.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/game/JMod_clan_rank.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/game/Lieutenant_clan_rank.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/game/Owner_clan_rank.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/game/Recruit_clan_rank.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/game/Sergeant_clan_rank.png diff --git a/runelite-client/src/main/java/net/runelite/client/game/ClanManager.java b/runelite-client/src/main/java/net/runelite/client/game/ClanManager.java index 3d35edac8d..53908086a6 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/ClanManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ClanManager.java @@ -28,16 +28,17 @@ import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.google.common.eventbus.Subscribe; +import java.awt.Color; +import java.awt.Dimension; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.DataBufferByte; import java.awt.image.IndexColorModel; import java.awt.image.WritableRaster; -import java.io.IOException; import java.util.Arrays; import java.util.Objects; import java.util.concurrent.TimeUnit; -import javax.imageio.ImageIO; +import javax.annotation.Nonnull; import javax.inject.Inject; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; @@ -46,26 +47,33 @@ import net.runelite.api.ClanMemberRank; import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.IndexedSprite; +import net.runelite.api.SpriteID; import net.runelite.api.events.ClanChanged; import net.runelite.api.events.GameStateChanged; +import net.runelite.client.util.ImageUtil; import net.runelite.client.util.Text; @Singleton @Slf4j public class ClanManager { - private static final String[] CLANCHAT_IMAGES = + private static final int[] CLANCHAT_IMAGES = { - "Friend_clan_rank.png", "Recruit_clan_rank.png", - "Corporal_clan_rank.png", "Sergeant_clan_rank.png", - "Lieutenant_clan_rank.png", "Captain_clan_rank.png", - "General_clan_rank.png", "Owner_clan_rank.png", - "JMod_clan_rank.png" + SpriteID.CLAN_CHAT_RANK_SMILEY_FRIEND, + SpriteID.CLAN_CHAT_RANK_SINGLE_CHEVRON_RECRUIT, + SpriteID.CLAN_CHAT_RANK_DOUBLE_CHEVRON_CORPORAL, + SpriteID.CLAN_CHAT_RANK_TRIPLE_CHEVRON_SERGEANT, + SpriteID.CLAN_CHAT_RANK_BRONZE_STAR_LIEUTENANT, + SpriteID.CLAN_CHAT_RANK_SILVER_STAR_CAPTAIN, + SpriteID.CLAN_CHAT_RANK_GOLD_STAR_GENERAL, + SpriteID.CLAN_CHAT_RANK_KEY_CHANNEL_OWNER, + SpriteID.CLAN_CHAT_RANK_CROWN_JAGEX_MODERATOR, }; - - private int modIconsLength; + private static final Dimension CLANCHAT_IMAGE_DIMENSION = new Dimension(11, 11); + private static final Color CLANCHAT_IMAGE_OUTLINE_COLOR = new Color(33, 33, 33); private final Client client; + private final SpriteManager spriteManager; private final BufferedImage[] clanChatImages = new BufferedImage[CLANCHAT_IMAGES.length]; private final LoadingCache clanRanksCache = CacheBuilder.newBuilder() @@ -74,7 +82,7 @@ public class ClanManager .build(new CacheLoader() { @Override - public ClanMemberRank load(String key) throws Exception + public ClanMemberRank load(@Nonnull String key) { final ClanMember[] clanMembersArr = client.getClanMembers(); @@ -92,27 +100,13 @@ public class ClanManager } }); + private int modIconsLength; + @Inject - private ClanManager(Client client) + private ClanManager(Client client, SpriteManager spriteManager) { this.client = client; - - int i = 0; - for (String resource : CLANCHAT_IMAGES) - { - try - { - final BufferedImage bufferedImage = rgbaToIndexedBufferedImage(ImageIO - .read(ClanManager.class.getResource(resource))); - clanChatImages[i] = bufferedImage; - } - catch (IOException e) - { - log.warn("unable to load clan image", e); - } - - ++i; - } + this.spriteManager = spriteManager; } public ClanMemberRank getRank(String playerName) @@ -138,10 +132,9 @@ public class ClanManager @Subscribe public void onGameStateChanged(GameStateChanged gameStateChanged) { - if (gameStateChanged.getGameState() == GameState.LOGIN_SCREEN + if (gameStateChanged.getGameState() == GameState.LOGGED_IN && modIconsLength == 0) { - // this is after "Loading sprites" so we can modify modicons now loadClanChatIcons(); } } @@ -154,25 +147,19 @@ public class ClanManager private void loadClanChatIcons() { - try - { - final IndexedSprite[] modIcons = client.getModIcons(); - final IndexedSprite[] newModIcons = Arrays.copyOf(modIcons, modIcons.length + CLANCHAT_IMAGES.length); - int curPosition = newModIcons.length - CLANCHAT_IMAGES.length; + final IndexedSprite[] modIcons = client.getModIcons(); + final IndexedSprite[] newModIcons = Arrays.copyOf(modIcons, modIcons.length + CLANCHAT_IMAGES.length); + int curPosition = newModIcons.length - CLANCHAT_IMAGES.length; - for (BufferedImage image : clanChatImages) - { - IndexedSprite sprite = createIndexedSprite(client, image); - newModIcons[curPosition++] = sprite; - } - - client.setModIcons(newModIcons); - modIconsLength = newModIcons.length; - } - catch (IOException e) + for (int i = 0; i < CLANCHAT_IMAGES.length; i++, curPosition++) { - log.warn("Failed loading of clan chat icons", e); + final int resource = CLANCHAT_IMAGES[i]; + clanChatImages[i] = rgbaToIndexedBufferedImage(clanChatImageFromSprite(spriteManager.getSprite(resource, 0))); + newModIcons[curPosition] = createIndexedSprite(client, clanChatImages[i]); } + + client.setModIcons(newModIcons); + modIconsLength = newModIcons.length; } private static String sanitize(String lookup) @@ -181,7 +168,7 @@ public class ClanManager return cleaned.replace('\u00A0', ' '); } - private static IndexedSprite createIndexedSprite(final Client client, final BufferedImage bufferedImage) throws IOException + private static IndexedSprite createIndexedSprite(final Client client, final BufferedImage bufferedImage) { final IndexColorModel indexedCM = (IndexColorModel) bufferedImage.getColorModel(); @@ -228,4 +215,10 @@ public class ClanManager resultIndexedImage.getGraphics().drawImage(sourceBufferedImage, 0, 0, null); return resultIndexedImage; } + + private static BufferedImage clanChatImageFromSprite(final BufferedImage clanSprite) + { + final BufferedImage clanChatCanvas = ImageUtil.resizeCanvas(clanSprite, CLANCHAT_IMAGE_DIMENSION.width, CLANCHAT_IMAGE_DIMENSION.height); + return ImageUtil.outlineImage(clanChatCanvas, CLANCHAT_IMAGE_OUTLINE_COLOR); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/util/ColorUtil.java b/runelite-client/src/main/java/net/runelite/client/util/ColorUtil.java index f09cac21c9..7cd6ae0e1a 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/ColorUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/util/ColorUtil.java @@ -112,4 +112,14 @@ public class ColorUtil { return String.format("%06x", color.getRGB() & 0xFFFFFF); } + + static boolean isFullyTransparent(final Color color) + { + return color.getAlpha() == 0; + } + + static boolean isNotFullyTransparent(final Color color) + { + return !isFullyTransparent(color); + } } 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 13828dad52..22b6d8b671 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 @@ -24,6 +24,7 @@ */ package net.runelite.client.util; +import java.awt.Color; import java.awt.Graphics2D; import java.awt.Image; import java.awt.geom.AffineTransform; @@ -32,6 +33,7 @@ import java.awt.image.BufferedImage; import java.awt.image.RescaleOp; import java.util.Arrays; import javax.swing.GrayFilter; +import java.util.function.Predicate; /** * Various Image/BufferedImage utilities. @@ -178,6 +180,26 @@ public class ImageUtil return ImageUtil.bufferedImageFromImage(resized); } + /** + * Re-size a BufferedImage's canvas to the given dimensions. + * + * @param image The image whose canvas should be re-sized. + * @param newWidth The width to set the BufferedImage to. + * @param newHeight The height to set the BufferedImage to. + * @return The BufferedImage centered within canvas of given dimensions. + */ + public static BufferedImage resizeCanvas(final BufferedImage image, final int newWidth, final int newHeight) + { + final BufferedImage dimg = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB); + final int centeredX = newWidth / 2 - image.getWidth() / 2; + final int centeredY = newHeight / 2 - image.getHeight() / 2; + + final Graphics2D g2d = dimg.createGraphics(); + g2d.drawImage(image, centeredX, centeredY, null); + g2d.dispose(); + return dimg; + } + /** * Rotates an image around its center by a given number of radians. * @@ -229,6 +251,124 @@ public class ImageUtil return out; } + /** + * Outlines non-transparent pixels of a BufferedImage with the given color. + * + * @param image The image to be outlined. + * @param color The color to use for the outline. + * @return The BufferedImage with its edges outlined with the given color. + */ + public static BufferedImage outlineImage(final BufferedImage image, final Color color) + { + return outlineImage(image, color, ColorUtil::isNotFullyTransparent, false); + } + + /** + * Outlines pixels of a BufferedImage with the given color, using a given predicate to colorize + * the given image for outlining. + * + * @param image The image to be outlined. + * @param color The color to use for the outline. + * @param fillCondition The predicate to be consumed by {@link #fillImage(BufferedImage, Color, Predicate) fillImage(BufferedImage, Color, Predicate)} + * @return The BufferedImage with its edges outlined with the given color. + */ + public static BufferedImage outlineImage(final BufferedImage image, final Color color, final Predicate fillCondition) + { + return outlineImage(image, color, fillCondition, false); + } + + /** + * Outlines non-transparent pixels of a BufferedImage with the given color. Optionally outlines + * corners in addition to edges. + * + * @param image The image to be outlined. + * @param color The color to use for the outline. + * @param outlineCorners Whether to draw an outline around corners, or only around edges. + * @return The BufferedImage with its edges--and optionally, corners--outlined + * with the given color. + */ + public static BufferedImage outlineImage(final BufferedImage image, final Color color, final Boolean outlineCorners) + { + return outlineImage(image, color, ColorUtil::isNotFullyTransparent, outlineCorners); + } + + /** + * Outlines pixels of a BufferedImage with the given color, using a given predicate to colorize + * the given image for outlining. Optionally outlines corners in addition to edges. + * + * @param image The image to be outlined. + * @param color The color to use for the outline. + * @param fillCondition The predicate to be consumed by {@link #fillImage(BufferedImage, Color, Predicate) fillImage(BufferedImage, Color, Predicate)} + * @param outlineCorners Whether to draw an outline around corners, or only around edges. + * @return The BufferedImage with its edges--and optionally, corners--outlined + * with the given color. + */ + public static BufferedImage outlineImage(final BufferedImage image, final Color color, final Predicate fillCondition, final Boolean outlineCorners) + { + final BufferedImage filledImage = fillImage(image, color, fillCondition); + final BufferedImage outlinedImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB); + + final Graphics2D g2d = outlinedImage.createGraphics(); + for (int x = -1; x <= 1; x++) + { + for (int y = -1; y <= 1; y++) + { + if ((x == 0 && y == 0) + || (!outlineCorners && Math.abs(x) + Math.abs(y) != 1)) + { + continue; + } + + g2d.drawImage(filledImage, x, y, null); + } + } + g2d.drawImage(image, 0, 0, null); + g2d.dispose(); + + return outlinedImage; + } + + /** + * Fills all non-transparent pixels of the given image with the given color. + * + * @param image The image which should have its non-transparent pixels filled. + * @param color The color with which to fill pixels. + * @return The given image with all non-transparent pixels set to the given color. + */ + static BufferedImage fillImage(final BufferedImage image, final Color color) + { + return fillImage(image, color, ColorUtil::isNotFullyTransparent); + } + + /** + * Fills pixels of the given image with the given color based on a given fill condition + * predicate. + * + * @param image The image which should have its non-transparent pixels filled. + * @param color The color with which to fill pixels. + * @param fillCondition The condition on which to fill pixels with the given color. + * @return The given image with all pixels fulfilling the fill condition predicate + * set to the given color. + */ + static BufferedImage fillImage(final BufferedImage image, final Color color, final Predicate fillCondition) + { + final BufferedImage filledImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB); + for (int x = 0; x < filledImage.getWidth(); x++) + { + for (int y = 0; y < filledImage.getHeight(); y++) + { + final Color pixelColor = new Color(image.getRGB(x, y), true); + if (!fillCondition.test(pixelColor)) + { + continue; + } + + filledImage.setRGB(x, y, color.getRGB()); + } + } + return filledImage; + } + /** * Performs a rescale operation on the image's color components. * diff --git a/runelite-client/src/main/resources/net/runelite/client/game/Captain_clan_rank.png b/runelite-client/src/main/resources/net/runelite/client/game/Captain_clan_rank.png deleted file mode 100644 index 396ec708c9e5bfe4f4956c3418d8253add09a0d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2986 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 diff --git a/runelite-client/src/main/resources/net/runelite/client/game/Corporal_clan_rank.png b/runelite-client/src/main/resources/net/runelite/client/game/Corporal_clan_rank.png deleted file mode 100644 index 197b1ad4696ec105e6f646f8e969abc9b4de4808..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2854 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 Eg06^4H~;_u diff --git a/runelite-client/src/main/resources/net/runelite/client/game/Friend_clan_rank.png b/runelite-client/src/main/resources/net/runelite/client/game/Friend_clan_rank.png deleted file mode 100644 index ab2d17e1567fd0ee8358c680ba0b57f27d9d1491..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2944 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 LNkvXXu0mjfulj-> diff --git a/runelite-client/src/main/resources/net/runelite/client/game/Owner_clan_rank.png b/runelite-client/src/main/resources/net/runelite/client/game/Owner_clan_rank.png deleted file mode 100644 index 96f259592a0b36ff079044ecd9a83514ae70424b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2893 zcmV-T3$pZyP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0001ZNklu_=k1i)W;-`2T&pUb?ncFid`B`*uA*jKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0000;NklLoB;y>jCMTqju|(<00000NkvXXu0mjf3sOST diff --git a/runelite-client/src/main/resources/net/runelite/client/game/Sergeant_clan_rank.png b/runelite-client/src/main/resources/net/runelite/client/game/Sergeant_clan_rank.png deleted file mode 100644 index d85228c07358696c382181fc0e405a943b77a721..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2869 zcmV-53(E9~P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0001BNkl(|Ff-8K#n;#|WH)g=q2sOOS+9HG`yr_F(`Z znYy)*h!XVNm#Y?9Fp}3CUPxhkSaY~+ZsABeCdX}jlI=4=TQbZjJ5N6TT<{$LcwQo` TS8kRN00000NkvXXu0mjfpj=Qj diff --git a/runelite-client/src/test/java/net/runelite/client/util/ColorUtilTest.java b/runelite-client/src/test/java/net/runelite/client/util/ColorUtilTest.java index d5c7530c51..3697dac28c 100644 --- a/runelite-client/src/test/java/net/runelite/client/util/ColorUtilTest.java +++ b/runelite-client/src/test/java/net/runelite/client/util/ColorUtilTest.java @@ -96,4 +96,26 @@ public class ColorUtilTest assertEquals(hex, ColorUtil.colorToHexCode(color)); }); } + + @Test + public void isFullyTransparent() + { + for (Color color : COLOR_HEXSTRING_MAP.keySet()) + { + assert(!ColorUtil.isFullyTransparent(color)); + } + assert(ColorUtil.isFullyTransparent(new Color(0, 0, 0, 0))); + assert(!ColorUtil.isFullyTransparent(new Color(0, 0, 0, 1))); + } + + @Test + public void isNotFullyTransparent() + { + for (Color color : COLOR_HEXSTRING_MAP.keySet()) + { + assert(ColorUtil.isNotFullyTransparent(color)); + } + assert(!ColorUtil.isNotFullyTransparent(new Color(0, 0, 0, 0))); + assert(ColorUtil.isNotFullyTransparent(new Color(0, 0, 0, 1))); + } } diff --git a/runelite-client/src/test/java/net/runelite/client/util/ImageUtilTest.java b/runelite-client/src/test/java/net/runelite/client/util/ImageUtilTest.java index 1156557160..a5d64b6a43 100644 --- a/runelite-client/src/test/java/net/runelite/client/util/ImageUtilTest.java +++ b/runelite-client/src/test/java/net/runelite/client/util/ImageUtilTest.java @@ -35,6 +35,7 @@ import java.awt.image.BufferedImage; import java.awt.image.DataBuffer; import java.awt.image.DataBufferInt; import java.util.Arrays; +import java.util.function.Predicate; import javax.annotation.Nonnull; import org.apache.commons.lang3.ArrayUtils; import static org.junit.Assert.assertEquals; @@ -193,6 +194,22 @@ public class ImageUtilTest } } + @Test + public void resizeCanvas() + { + assert(bufferedImagesEqual(centeredPixel(BLACK), ImageUtil.resizeCanvas(oneByOne(BLACK), 3, 3))); + assert(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.resizeCanvas(oneByOne(BLACK), 1, 1))); + assert(bufferedImagesEqual(oneByOne(BLACK), ImageUtil.resizeCanvas(centeredPixel(BLACK), 1, 1))); + + BufferedImage expected = new BufferedImage(2, 1, BufferedImage.TYPE_INT_ARGB); + expected.setRGB(1, 0, BLACK.getRGB()); + assert(bufferedImagesEqual(expected, ImageUtil.resizeCanvas(oneByOne(BLACK), 2, 1))); + + expected = new BufferedImage(1, 2, BufferedImage.TYPE_INT_ARGB); + expected.setRGB(0, 1, BLACK.getRGB()); + assert(bufferedImagesEqual(expected, ImageUtil.resizeCanvas(oneByOne(BLACK), 1, 2))); + } + @Test public void rotateImage() { @@ -230,6 +247,79 @@ public class ImageUtilTest assert(bufferedImagesEqual(BLACK_PIXEL_BOTTOM_RIGHT, ImageUtil.flipImage(BLACK_PIXEL_TOP_LEFT, true, true))); } + @Test + public void fillImage() + { + // fillImage(BufferedImage image, Color color) + assert(bufferedImagesEqual(centeredPixel(GRAY), ImageUtil.fillImage(centeredPixel(BLACK), GRAY))); + assert(bufferedImagesEqual(solidColor(3, 3, GREEN), ImageUtil.fillImage(solidColor(3, 3, BLACK), GREEN))); + assert(bufferedImagesEqual(oneByOne(BLACK_TRANSPARENT), ImageUtil.fillImage(oneByOne(BLACK_TRANSPARENT), WHITE))); + + // fillImage(BufferedImage image, Color color, Predicate fillCondition) + BufferedImage expected = solidColor(CORNER_SIZE, CORNER_SIZE, WHITE); + expected.setRGB(0, 0, new Color(0, true).getRGB()); + assert(bufferedImagesEqual(expected, ImageUtil.fillImage(BLACK_PIXEL_TOP_LEFT, WHITE, ColorUtil::isFullyTransparent))); + } + + @Test + public void outlineImage() + { + // outlineImage(BufferedImage image, Color color) + BufferedImage expected = new BufferedImage(CENTERED_SIZE, CENTERED_SIZE, BufferedImage.TYPE_INT_ARGB); + for (int x = 0; x < expected.getWidth(); x++) + { + for (int y = 0; y < expected.getHeight(); y++) + { + if (x != 1 && y != 1) + { + continue; + } + expected.setRGB(x, y, BLACK.getRGB()); + } + } + assert(bufferedImagesEqual(expected, ImageUtil.outlineImage(centeredPixel(BLACK), BLACK))); + expected.setRGB(1, 1, WHITE.getRGB()); + assert(bufferedImagesEqual(expected, ImageUtil.outlineImage(centeredPixel(WHITE), BLACK))); + expected = solidColor(CORNER_SIZE, CORNER_SIZE, WHITE); + expected.setRGB(0, 0, BLACK.getRGB()); + expected.setRGB(1, 1, new Color(0, true).getRGB()); + assert(bufferedImagesEqual(expected, ImageUtil.outlineImage(BLACK_PIXEL_TOP_LEFT, WHITE))); + + // outlineImage(BufferedImage image, Color color, Predicate fillCondition) + BufferedImage test = new BufferedImage(CORNER_SIZE, CORNER_SIZE, BufferedImage.TYPE_INT_ARGB); + test.setRGB(0, 0, BLACK.getRGB()); + test.setRGB(1, 0, GRAY.getRGB()); + expected = test; + expected.setRGB(0, 1, BLUE.getRGB()); + assert(bufferedImagesEqual(expected, ImageUtil.outlineImage(test, BLUE, (color -> color.equals(BLACK))))); + + // outlineImage(BufferedImage image, Color color, Boolean outlineCorners) + expected = solidColor(CORNER_SIZE, CORNER_SIZE, WHITE); + expected.setRGB(0, 0, BLACK.getRGB()); + assert(bufferedImagesEqual(expected, ImageUtil.outlineImage(BLACK_PIXEL_TOP_LEFT, WHITE, true))); + assert(bufferedImagesEqual(solidColor(3, 3, BLACK), ImageUtil.outlineImage(centeredPixel(BLACK), BLACK, true))); + + // outlineImage(BufferedImage image, Color color, Predicate fillCondition, Boolean outlineCorners) + test = new BufferedImage(5, 5, BufferedImage.TYPE_INT_ARGB); + test.setRGB(2, 2, BLACK.getRGB()); + test.setRGB(1,2, new Color(50, 50, 50).getRGB()); + test.setRGB(3, 2, new Color(100, 100, 100).getRGB()); + test.setRGB(2, 3, new Color(150, 150, 150).getRGB()); + expected = test; + expected.setRGB(2, 1, RED.getRGB()); + expected.setRGB(3, 1, RED.getRGB()); + expected.setRGB(4, 1, RED.getRGB()); + expected.setRGB(4, 2, RED.getRGB()); + expected.setRGB(1, 3, RED.getRGB()); + expected.setRGB(3, 3, RED.getRGB()); + expected.setRGB(4, 3, RED.getRGB()); + expected.setRGB(1, 4, RED.getRGB()); + expected.setRGB(2, 4, RED.getRGB()); + expected.setRGB(3, 4, RED.getRGB()); + Predicate testPredicate = (color -> ColorUtil.isNotFullyTransparent(color) && color.getRed() > 75 && color.getGreen() > 75 && color.getBlue() > 75); + assert(bufferedImagesEqual(expected, ImageUtil.outlineImage(test, RED, testPredicate, true))); + } + /** * Compares whether two {@link BufferedImage}s are equal in data. * From ff31ffef01088d7b4612dbaa8688fe1e9446550d Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Tue, 17 Jul 2018 19:56:59 -0700 Subject: [PATCH 06/17] plugins: Use shared clue arrow and reset images These images are used throughout multiple plugins, thus are moved to a new utility directory. --- .../plugins/cluescrolls/ClueScrollPlugin.java | 2 +- .../deathindicator/DeathWorldMapPoint.java | 2 +- .../kourendlibrary/KourendLibraryPanel.java | 2 +- .../plugins/mta/alchemy/AlchemyRoomTimer.java | 2 +- .../plugins/deathindicator/clue_arrow.png | Bin 368 -> 0 bytes .../client/plugins/mta/alchemy/reset.png | Bin 16069 -> 0 bytes .../plugins/cluescrolls => util}/clue_arrow.png | Bin .../plugins/kourendlibrary => util}/reset.png | Bin 8 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/deathindicator/clue_arrow.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/mta/alchemy/reset.png rename runelite-client/src/main/resources/{net/runelite/client/plugins/cluescrolls => util}/clue_arrow.png (100%) rename runelite-client/src/main/resources/{net/runelite/client/plugins/kourendlibrary => util}/reset.png (100%) 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 4ac8fab050..4d092127f9 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 @@ -158,7 +158,7 @@ public class ClueScrollPlugin extends Plugin synchronized (ImageIO.class) { CLUE_SCROLL_IMAGE = ImageIO.read(ClueScrollPlugin.class.getResourceAsStream("clue_scroll.png")); - MAP_ARROW = ImageIO.read(ClueScrollPlugin.class.getResourceAsStream("clue_arrow.png")); + MAP_ARROW = ImageIO.read(ClueScrollPlugin.class.getResourceAsStream("/util/clue_arrow.png")); EMOTE_IMAGE = ImageIO.read(ClueScrollPlugin.class.getResourceAsStream("emote.png")); SPADE_IMAGE = ImageIO.read(ClueScrollPlugin.class.getResourceAsStream("spade.png")); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathWorldMapPoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathWorldMapPoint.java index 629d05b27e..2ef3557965 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathWorldMapPoint.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathWorldMapPoint.java @@ -45,7 +45,7 @@ class DeathWorldMapPoint extends WorldMapPoint { synchronized (ImageIO.class) { - MAP_ARROW = ImageIO.read(DeathWorldMapPoint.class.getResourceAsStream("clue_arrow.png")); + MAP_ARROW = ImageIO.read(DeathWorldMapPoint.class.getResourceAsStream("/util/clue_arrow.png")); } } catch (IOException e) 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 3dcf7e6542..229c307769 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 @@ -71,7 +71,7 @@ class KourendLibraryPanel extends PluginPanel { synchronized (ImageIO.class) { - BufferedImage resetIcon = ImageIO.read(KourendLibraryPanel.class.getResourceAsStream("reset.png")); + BufferedImage resetIcon = ImageIO.read(KourendLibraryPanel.class.getResourceAsStream("/util/reset.png")); RESET_ICON = new ImageIcon(resetIcon); RESET_CLICK_ICON = new ImageIcon(ImageUtil.alphaOffset(resetIcon, -100)); } 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 1cde50d6f3..7f4d295aaf 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 @@ -55,7 +55,7 @@ public class AlchemyRoomTimer extends Timer { synchronized (ImageIO.class) { - image = ImageIO.read(AlchemyRoomTimer.class.getResourceAsStream("reset.png")); + image = ImageIO.read(AlchemyRoomTimer.class.getResourceAsStream("/util/reset.png")); } } catch (IOException ex) diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/deathindicator/clue_arrow.png b/runelite-client/src/main/resources/net/runelite/client/plugins/deathindicator/clue_arrow.png deleted file mode 100644 index 1d0e78056416f5f69be00a3c32cf7b69ee24cf03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^3P7yR!3HGr>b-n`6kC$Fy9>jA5L~c#`DCC7XMsm# zF#`j)FbFd;%$g$s6l5>)^mS!_#3CmkZy2=4dLmHhucwP+NW|f{GdB7i3XpI+zqfe? z!?f~^I!A=qtscHewmPLWL&B%vLi*6 zi8tKgt%@=6hL=g})7cSp1DzCtaonHHvYe37nNQ1o+8dYZ`u2}&wIE&cHWrq z-u8Zl&6FjcJ|$OI?a|a0>*1gBn~mXwLg&jr!V{ksA6qXU_k5P}zQuC|=l`73x%|(K zhWj0}v#kPmPurt6Np0hjzv~3vJrA>7wC)f4TZ^ETd>R*ufC0ha>FVdQ&MBb@07qw< ALjV8( diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/mta/alchemy/reset.png b/runelite-client/src/main/resources/net/runelite/client/plugins/mta/alchemy/reset.png deleted file mode 100644 index e94f6102a5cd22911c1e858557a9eb5c96decb4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16069 zcmeI3dsGuw8o0B2tiC#u%f(Fu=p4z6BtM`F$oYJivqP3 z>w{VqU*MyQU7uL1R%@-)f>l?g3P-!zR#3o4!P;8IE*#lA36F4rIiAz**?(rvfy{Tm z*WBN|-*@MqDTtUkZHW8d+z|vB5*DhB0>3ZQe}e~t|83t){T}?hXbz3DB8bN@`fmWT zdFx07;fy3Tnuv%b%0^j}C^I)qqv4t@l%6yY2x7mEFIrSmd-qoT`Pa(JBO+p=>V4`* zdV6}8mgkh@uFBn%OJ8G!$B&f@x#jQC_h>M>egG%?#F_H5<>lq(xNDay&#ljuly8oY zh&c@gmgeSuHF5lr0N`5Z!Qp5!Gr~e%Hv``Gjfz7a4VaZc~ z4JY546GBAlGp82h?I_oTU9)>I*JIO*udcRXiKjij{g54 z@7d@-V#J22b0%Ds$$XBIP3N1oDB=|+%Lwyg3%?=lR!&9r>AhcNtu9-+u%!L)q-EPb zuN|_(9}BEQd3&csSJYRU3aSbR7Y#4^VytwUGGuCaPsn$hW>m$Me(H5e5!_Oh z-Ru_W5$M$%-_hVsR#ja;lX~Oosek|Tu&?D&1^@Mk z-_c(eK04LhKK7yb-n9+Eh9%>k?SIxj1{rvodvWkT)?G#rB}&G`+G4|JC~?Z@kLjoc z!ryK*gNi~BRj}QR;VFcTn?NLzrXb$WCrV6rOhK|DuXCAg=DQ6AS}VoM3)h0qDPvEdP14P_y?QhymA z7s%vXxx!y4mCGgaH@PB#P>Kq~s93-kiIoz8QX=AZTs*ZqxKmkldS#S$YDYRC1@V$> zHnS2%)6>)a)5ZRjB@q=W6be)zLPa7zu;5!WOg7BUH(AFygLKBx5?0(onr$Ry;?i-k z1S-`Q#N*M4x~`6S8O>dZOx6x|fFf$g%&5>`fcE92!@GRUsTPCd(R4UU7ziU_vRQ$j zuung8XBX>o?~$@g-EU&BCgI_IJ9j>>(b#8dt8GdeK+u7-N7_zLYfOfjK%)pNm1@C> zDQRFT|{S~w8rV?*b2@SQh~WDH5LN1QI;5rGN_%qtotAU z=K#H{xD)4+CLNV-^;My;OZR$rMk>zYEA^Dch}qPn5lbXcvnf%9b`QE( zcI_&qhB8nV@K}Ues6zW1?$Zk#xDn3tR;{IM+-VqT;tB=hT_d=dxP)+QR%MvUYQs!8 z5vEmx0e_OzDFq37ksbr|2}~m8>j;UEkLhq7AIBBA6bn!Uh{RIII)sP2y7vmLrSMd` z;6P|+Z_-gX2;V(3nS{_w1s+dIhG}V+ukb>zYd+VS1$sC9Pn? zXSfssCCRx;#7F$llBOd0!s6E}_ z@G6u(P7LJ#U?Hqn+8+4NIPMO)smnOTj_ox4CwHI6@5C! z_2=lK=x}r{mCKu*qXwO$;Jp#NvZ7t@ti8&!tBd`aH{CP(GowPW*d!1TW|76k%m>o4 zxF8_RB8!We52R&rK|q*A78f%gNXz1afG~?JE@nQEmc<1DVHR0j%zPj%iwgq6EV8(m z`9NA07X*Y^WN|U`fwU|x2ne&t;$r3lX<1wl5N46Z#mooNvbZ21%p!}6nGd98aX~|du`BRuMHD@ zcb?2UnmlUlu~o9NO4E1q^MjXFUwoLIy<}K@OZC(Iu`%cq?{7m&j=eaDG}(ng1GJ$_=vaC6o1+wO6uZ*~O}L-ib}*o2{>H0~ z18WNk_`hlkJhmB^gqZB5`X4hBckMbl_ufw)>V!#N8TGvQB9Ec%PqwKCA!!pn)qHbz S`9At1+OR1zwFf3I%KI-(1ve%D diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/cluescrolls/clue_arrow.png b/runelite-client/src/main/resources/util/clue_arrow.png similarity index 100% rename from runelite-client/src/main/resources/net/runelite/client/plugins/cluescrolls/clue_arrow.png rename to runelite-client/src/main/resources/util/clue_arrow.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/kourendlibrary/reset.png b/runelite-client/src/main/resources/util/reset.png similarity index 100% rename from runelite-client/src/main/resources/net/runelite/client/plugins/kourendlibrary/reset.png rename to runelite-client/src/main/resources/util/reset.png From bcaa92905f24d339e069a9c79498e99aa963583e Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Tue, 17 Jul 2018 18:53:40 -0700 Subject: [PATCH 07/17] agility plugin: Use Item ID for arena timer --- .../plugins/agility/AgilityArenaTimer.java | 29 ++---------------- .../client/plugins/agility/AgilityPlugin.java | 7 ++++- .../plugins/agility/agilityarenaticket.png | Bin 742 -> 0 bytes 3 files changed, 8 insertions(+), 28 deletions(-) delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/agility/agilityarenaticket.png diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityArenaTimer.java b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityArenaTimer.java index 740852ef92..05b217e125 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityArenaTimer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityArenaTimer.java @@ -25,9 +25,7 @@ package net.runelite.client.plugins.agility; 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; @@ -35,32 +33,9 @@ import net.runelite.client.ui.overlay.infobox.Timer; @Slf4j class AgilityArenaTimer extends Timer { - AgilityArenaTimer(Plugin plugin) + AgilityArenaTimer(Plugin plugin, BufferedImage image) { - super(1, ChronoUnit.MINUTES, getTicketImage(), plugin); + super(1, ChronoUnit.MINUTES, image, plugin); setTooltip("Time left until location changes"); } - - private static BufferedImage image; - private static BufferedImage getTicketImage() - { - if (image != null) - { - return image; - } - - try - { - synchronized (ImageIO.class) - { - image = ImageIO.read(AgilityArenaTimer.class.getResourceAsStream( "agilityarenaticket.png")); - } - } - catch (IOException ex) - { - log.warn("unable to load image", ex); - } - - return image; - } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java index 06a33a285c..735a070cf2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java @@ -35,6 +35,7 @@ import lombok.Getter; import net.runelite.api.Client; import net.runelite.api.Item; import net.runelite.api.ItemID; +import static net.runelite.api.ItemID.AGILITY_ARENA_TICKET; import net.runelite.api.Player; import static net.runelite.api.Skill.AGILITY; import net.runelite.api.Tile; @@ -60,6 +61,7 @@ import net.runelite.api.events.WallObjectDespawned; import net.runelite.api.events.WallObjectSpawned; import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; +import net.runelite.client.game.ItemManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.overlay.OverlayManager; @@ -101,6 +103,9 @@ public class AgilityPlugin extends Plugin @Inject private AgilityConfig config; + @Inject + private ItemManager itemManager; + @Getter private AgilitySession session; @@ -275,7 +280,7 @@ public class AgilityPlugin extends Plugin private void showNewAgilityArenaTimer() { removeAgilityArenaTimer(); - infoBoxManager.addInfoBox(new AgilityArenaTimer(this)); + infoBoxManager.addInfoBox(new AgilityArenaTimer(this, itemManager.getImage(AGILITY_ARENA_TICKET))); } @Subscribe diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/agility/agilityarenaticket.png b/runelite-client/src/main/resources/net/runelite/client/plugins/agility/agilityarenaticket.png deleted file mode 100644 index 55b841db979e8459bbcb8f056b6310fdf5ebc22f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 742 zcmVPx%ph-kQR7l6Ymd|PvQ543%$)s3?68i?Og)Ur(2qL)h1&mfuR5UJ>f=D)M#V9JR z8>RRMl(v#0h-B4;C z_sjuOhaHt|7|43CvTu!8WJwU(edy z{e1e#KCt`zeh3HeBw}#5a+w*-0%CzM;bQrD>imXE#W^~C*Q$%g#^Ptxm%sD`63Z~f zA+Txj;9)Q`D7?GpRvkZX7q(57;$9F7m<3FXnHx)~)H-q1=-t~X0Ko6>N31%3qFjmUNL~smLoYMN5&51B2E}A4D z5rbH8^Xjoko3qvKq}a@kJbO^GdF=-TfXzl5T8Gt4YY+<>o(m>IZS^Bk{vjNBGIyaT z5CAqdTkw4aB8Ji$^=8h3qE6=1R*@v2?`t$Y1>aZjm4P-UR3)gbez2ec8nbS-5AU1- zg%&m%Z8SZFR;wLrVH_+2Gyqr1#V%Nqg&DiS`1ti_6P~a7S~yzh27w8gU_*8L!*=<9 Y0aVq-g_Ue2?EnA(07*qoM6N<$f-~z=f&c&j From ecea2e28ca41ee8821d69844d4aecdc9c93977a4 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Wed, 18 Jul 2018 15:46:11 -0700 Subject: [PATCH 08/17] clue scroll plugin: Use Item IDs for overlays --- .../plugins/cluescrolls/ClueScrollPlugin.java | 82 +++++++++++++----- .../cluescrolls/ClueScrollWorldMapPoint.java | 37 ++++---- .../cluescrolls/clues/AnagramClue.java | 3 +- .../plugins/cluescrolls/clues/CipherClue.java | 3 +- .../cluescrolls/clues/CoordinateClue.java | 3 +- .../cluescrolls/clues/CrypticClue.java | 8 +- .../plugins/cluescrolls/clues/EmoteClue.java | 3 +- .../cluescrolls/clues/FairyRingClue.java | 3 +- .../cluescrolls/clues/HotColdClue.java | 8 +- .../plugins/cluescrolls/clues/MapClue.java | 6 +- .../plugins/cluescrolls/clue_scroll.png | Bin 15191 -> 0 bytes .../client/plugins/cluescrolls/spade.png | Bin 15302 -> 0 bytes 12 files changed, 89 insertions(+), 67 deletions(-) delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/cluescrolls/clue_scroll.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/cluescrolls/spade.png 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 4d092127f9..2f42c55011 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 @@ -47,6 +47,7 @@ import net.runelite.api.InventoryID; import net.runelite.api.Item; import net.runelite.api.ItemComposition; import net.runelite.api.ItemContainer; +import net.runelite.api.ItemID; import net.runelite.api.NPC; import net.runelite.api.Query; import net.runelite.api.Scene; @@ -96,11 +97,6 @@ public class ClueScrollPlugin extends Plugin { private static final Duration WAIT_DURATION = Duration.ofMinutes(4); - public static final BufferedImage CLUE_SCROLL_IMAGE; - public static final BufferedImage MAP_ARROW; - public static final BufferedImage EMOTE_IMAGE; - public static final BufferedImage SPADE_IMAGE; - @Getter private ClueScroll clue; @@ -147,28 +143,12 @@ public class ClueScrollPlugin extends Plugin @Inject private WorldMapPointManager worldMapPointManager; + private BufferedImage emoteImage; + private BufferedImage mapArrow; private Integer clueItemId; private boolean clueItemChanged = false; private boolean worldMapPointsSet = false; - static - { - try - { - synchronized (ImageIO.class) - { - CLUE_SCROLL_IMAGE = ImageIO.read(ClueScrollPlugin.class.getResourceAsStream("clue_scroll.png")); - MAP_ARROW = ImageIO.read(ClueScrollPlugin.class.getResourceAsStream("/util/clue_arrow.png")); - EMOTE_IMAGE = ImageIO.read(ClueScrollPlugin.class.getResourceAsStream("emote.png")); - SPADE_IMAGE = ImageIO.read(ClueScrollPlugin.class.getResourceAsStream("spade.png")); - } - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } - @Provides ClueScrollConfig getConfig(ConfigManager configManager) { @@ -411,6 +391,60 @@ public class ClueScrollPlugin extends Plugin } } + public BufferedImage getClueScrollImage() + { + return itemManager.getImage(ItemID.CLUE_SCROLL_MASTER); + } + + public BufferedImage getEmoteImage() + { + if (emoteImage != null) + { + return emoteImage; + } + + try + { + synchronized (ImageIO.class) + { + emoteImage = ImageIO.read(getClass().getResourceAsStream("emote.png")); + } + } + catch (IOException e) + { + throw new RuntimeException(e); + } + + return emoteImage; + } + + public BufferedImage getSpadeImage() + { + return itemManager.getImage(ItemID.SPADE); + } + + BufferedImage getMapArrow() + { + if (mapArrow != null) + { + return mapArrow; + } + + try + { + synchronized (ImageIO.class) + { + mapArrow = ImageIO.read(getClass().getResourceAsStream("/util/clue_arrow.png")); + } + } + catch (IOException e) + { + throw new RuntimeException(e); + } + + return mapArrow; + } + private void resetClue() { if (!clueItemChanged) @@ -594,7 +628,7 @@ public class ClueScrollPlugin extends Plugin for (final WorldPoint point : points) { - worldMapPointManager.add(new ClueScrollWorldMapPoint(point)); + worldMapPointManager.add(new ClueScrollWorldMapPoint(point, this)); } } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollWorldMapPoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollWorldMapPoint.java index 62b7891c9c..45fa1f874c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollWorldMapPoint.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollWorldMapPoint.java @@ -32,41 +32,40 @@ import net.runelite.client.ui.overlay.worldmap.WorldMapPoint; class ClueScrollWorldMapPoint extends WorldMapPoint { - private static final BufferedImage CLUE_SCROLL_WORLD_IMAGE; - private static final Point CLUE_SCROLL_WORLD_IMAGE_POINT; + private final ClueScrollPlugin plugin; + private final BufferedImage clueScrollWorldImage; + private final Point clueScrollWorldImagePoint; - static - { - CLUE_SCROLL_WORLD_IMAGE = new BufferedImage(ClueScrollPlugin.MAP_ARROW.getWidth(), ClueScrollPlugin.MAP_ARROW.getHeight(), BufferedImage.TYPE_INT_ARGB); - Graphics graphics = CLUE_SCROLL_WORLD_IMAGE.getGraphics(); - graphics.drawImage(ClueScrollPlugin.MAP_ARROW, 0, 0, null); - graphics.drawImage(ClueScrollPlugin.CLUE_SCROLL_IMAGE, 0, 2, null); - CLUE_SCROLL_WORLD_IMAGE_POINT = new Point( - CLUE_SCROLL_WORLD_IMAGE.getWidth() / 2, - CLUE_SCROLL_WORLD_IMAGE.getHeight()); - } - - ClueScrollWorldMapPoint(final WorldPoint worldPoint) + ClueScrollWorldMapPoint(final WorldPoint worldPoint, ClueScrollPlugin plugin) { super(worldPoint, null); + clueScrollWorldImage = new BufferedImage(plugin.getMapArrow().getWidth(), plugin.getMapArrow().getHeight(), BufferedImage.TYPE_INT_ARGB); + Graphics graphics = clueScrollWorldImage.getGraphics(); + graphics.drawImage(plugin.getMapArrow(), 0, 0, null); + graphics.drawImage(plugin.getClueScrollImage(), 0, 0, null); + clueScrollWorldImagePoint = new Point( + clueScrollWorldImage.getWidth() / 2, + clueScrollWorldImage.getHeight()); + + this.plugin = plugin; this.setSnapToEdge(true); this.setJumpOnClick(true); - this.setImage(CLUE_SCROLL_WORLD_IMAGE); - this.setImagePoint(CLUE_SCROLL_WORLD_IMAGE_POINT); + this.setImage(clueScrollWorldImage); + this.setImagePoint(clueScrollWorldImagePoint); } @Override public void onEdgeSnap() { - this.setImage(ClueScrollPlugin.CLUE_SCROLL_IMAGE); + this.setImage(plugin.getClueScrollImage()); this.setImagePoint(null); } @Override public void onEdgeUnsnap() { - this.setImage(CLUE_SCROLL_WORLD_IMAGE); - this.setImagePoint(CLUE_SCROLL_WORLD_IMAGE_POINT); + this.setImage(clueScrollWorldImage); + this.setImagePoint(clueScrollWorldImagePoint); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/AnagramClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/AnagramClue.java index b4f51254f1..294907dcfe 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/AnagramClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/AnagramClue.java @@ -33,7 +33,6 @@ import net.runelite.api.NPC; import net.runelite.api.coords.WorldPoint; import static net.runelite.client.plugins.cluescrolls.ClueScrollOverlay.TITLED_CONTENT_COLOR; import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; -import static net.runelite.client.plugins.cluescrolls.ClueScrollPlugin.CLUE_SCROLL_IMAGE; import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.IMAGE_Z_OFFSET; import net.runelite.client.ui.overlay.OverlayUtil; import net.runelite.client.ui.overlay.components.LineComponent; @@ -203,7 +202,7 @@ public class AnagramClue extends ClueScroll implements TextClueScroll, NpcClueSc { for (NPC npc : plugin.getNpcsToMark()) { - OverlayUtil.renderActorOverlayImage(graphics, npc, CLUE_SCROLL_IMAGE, Color.ORANGE, IMAGE_Z_OFFSET); + OverlayUtil.renderActorOverlayImage(graphics, npc, plugin.getClueScrollImage(), Color.ORANGE, IMAGE_Z_OFFSET); } } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java index f715c84576..a55751fbd1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java @@ -33,7 +33,6 @@ import net.runelite.api.NPC; import net.runelite.api.coords.WorldPoint; import static net.runelite.client.plugins.cluescrolls.ClueScrollOverlay.TITLED_CONTENT_COLOR; import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; -import static net.runelite.client.plugins.cluescrolls.ClueScrollPlugin.CLUE_SCROLL_IMAGE; import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.IMAGE_Z_OFFSET; import net.runelite.client.ui.overlay.OverlayUtil; import net.runelite.client.ui.overlay.components.LineComponent; @@ -112,7 +111,7 @@ public class CipherClue extends ClueScroll implements TextClueScroll, NpcClueScr { for (NPC npc : plugin.getNpcsToMark()) { - OverlayUtil.renderActorOverlayImage(graphics, npc, CLUE_SCROLL_IMAGE, Color.ORANGE, IMAGE_Z_OFFSET); + OverlayUtil.renderActorOverlayImage(graphics, npc, plugin.getClueScrollImage(), Color.ORANGE, IMAGE_Z_OFFSET); } } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java index 5a84d40508..654f31e977 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java @@ -32,7 +32,6 @@ import net.runelite.api.ItemID; import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; -import static net.runelite.client.plugins.cluescrolls.ClueScrollPlugin.SPADE_IMAGE; import net.runelite.client.plugins.cluescrolls.clues.emote.ItemRequirement; import net.runelite.client.plugins.cluescrolls.clues.emote.SingleItemRequirement; import net.runelite.client.ui.overlay.OverlayUtil; @@ -77,6 +76,6 @@ public class CoordinateClue extends ClueScroll implements TextClueScroll, Locati return; } - OverlayUtil.renderTileOverlay(plugin.getClient(), graphics, localLocation, SPADE_IMAGE, Color.ORANGE); + OverlayUtil.renderTileOverlay(plugin.getClient(), graphics, localLocation, plugin.getSpadeImage(), Color.ORANGE); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java index 65ce2ebb59..d1aabbe261 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java @@ -38,8 +38,6 @@ import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; import static net.runelite.client.plugins.cluescrolls.ClueScrollOverlay.TITLED_CONTENT_COLOR; import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; -import static net.runelite.client.plugins.cluescrolls.ClueScrollPlugin.CLUE_SCROLL_IMAGE; -import static net.runelite.client.plugins.cluescrolls.ClueScrollPlugin.SPADE_IMAGE; import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.CLICKBOX_BORDER_COLOR; import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.CLICKBOX_FILL_COLOR; import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.CLICKBOX_HOVER_BORDER_COLOR; @@ -391,7 +389,7 @@ public class CrypticClue extends ClueScroll implements TextClueScroll, NpcClueSc if (localLocation != null) { - OverlayUtil.renderTileOverlay(plugin.getClient(), graphics, localLocation, SPADE_IMAGE, Color.ORANGE); + OverlayUtil.renderTileOverlay(plugin.getClient(), graphics, localLocation, plugin.getSpadeImage(), Color.ORANGE); } } @@ -400,7 +398,7 @@ public class CrypticClue extends ClueScroll implements TextClueScroll, NpcClueSc { for (NPC npc : plugin.getNpcsToMark()) { - OverlayUtil.renderActorOverlayImage(graphics, npc, CLUE_SCROLL_IMAGE, Color.ORANGE, IMAGE_Z_OFFSET); + OverlayUtil.renderActorOverlayImage(graphics, npc, plugin.getClueScrollImage(), Color.ORANGE, IMAGE_Z_OFFSET); } } @@ -416,7 +414,7 @@ public class CrypticClue extends ClueScroll implements TextClueScroll, NpcClueSc OverlayUtil.renderHoverableArea(graphics, gameObject.getClickbox(), mousePosition, CLICKBOX_FILL_COLOR, CLICKBOX_BORDER_COLOR, CLICKBOX_HOVER_BORDER_COLOR); - OverlayUtil.renderImageLocation(plugin.getClient(), graphics, gameObject.getLocalLocation(), CLUE_SCROLL_IMAGE, IMAGE_Z_OFFSET); + OverlayUtil.renderImageLocation(plugin.getClient(), graphics, gameObject.getLocalLocation(), plugin.getClueScrollImage(), IMAGE_Z_OFFSET); } } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/EmoteClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/EmoteClue.java index 2e9f25bf27..2e718d2b3f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/EmoteClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/EmoteClue.java @@ -38,7 +38,6 @@ import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; import static net.runelite.client.plugins.cluescrolls.ClueScrollOverlay.TITLED_CONTENT_COLOR; import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; -import static net.runelite.client.plugins.cluescrolls.ClueScrollPlugin.EMOTE_IMAGE; import net.runelite.client.plugins.cluescrolls.clues.emote.AllRequirementsCollection; import net.runelite.client.plugins.cluescrolls.clues.emote.AnyRequirementCollection; import net.runelite.client.plugins.cluescrolls.clues.emote.Emote; @@ -285,7 +284,7 @@ public class EmoteClue extends ClueScroll implements TextClueScroll, LocationClu return; } - OverlayUtil.renderTileOverlay(plugin.getClient(), graphics, localLocation, EMOTE_IMAGE, Color.ORANGE); + OverlayUtil.renderTileOverlay(plugin.getClient(), graphics, localLocation, plugin.getEmoteImage(), Color.ORANGE); } public static EmoteClue forText(String text) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FairyRingClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FairyRingClue.java index 590f31ee68..7841c85447 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FairyRingClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FairyRingClue.java @@ -34,7 +34,6 @@ import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; import static net.runelite.client.plugins.cluescrolls.ClueScrollOverlay.TITLED_CONTENT_COLOR; import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; -import static net.runelite.client.plugins.cluescrolls.ClueScrollPlugin.SPADE_IMAGE; import net.runelite.client.plugins.cluescrolls.clues.emote.ItemRequirement; import net.runelite.client.plugins.cluescrolls.clues.emote.SingleItemRequirement; import net.runelite.client.ui.overlay.OverlayUtil; @@ -102,7 +101,7 @@ public class FairyRingClue extends ClueScroll implements TextClueScroll, Locatio return; } - OverlayUtil.renderTileOverlay(plugin.getClient(), graphics, localLocation, SPADE_IMAGE, Color.ORANGE); + OverlayUtil.renderTileOverlay(plugin.getClient(), graphics, localLocation, plugin.getSpadeImage(), Color.ORANGE); } public static FairyRingClue forText(String text) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java index b340e9947d..f7c71b3f3d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java @@ -45,8 +45,6 @@ import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; import static net.runelite.client.plugins.cluescrolls.ClueScrollOverlay.TITLED_CONTENT_COLOR; import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; -import static net.runelite.client.plugins.cluescrolls.ClueScrollPlugin.CLUE_SCROLL_IMAGE; -import static net.runelite.client.plugins.cluescrolls.ClueScrollPlugin.SPADE_IMAGE; import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.IMAGE_Z_OFFSET; import net.runelite.client.plugins.cluescrolls.clues.hotcold.HotColdArea; import net.runelite.client.plugins.cluescrolls.clues.hotcold.HotColdLocation; @@ -196,7 +194,7 @@ public class HotColdClue extends ClueScroll implements LocationClueScroll, Locat if (localLocation != null) { - OverlayUtil.renderTileOverlay(plugin.getClient(), graphics, localLocation, SPADE_IMAGE, Color.ORANGE); + OverlayUtil.renderTileOverlay(plugin.getClient(), graphics, localLocation, plugin.getSpadeImage(), Color.ORANGE); } return; @@ -210,7 +208,7 @@ public class HotColdClue extends ClueScroll implements LocationClueScroll, Locat { for (NPC npc : plugin.getNpcsToMark()) { - OverlayUtil.renderActorOverlayImage(graphics, npc, CLUE_SCROLL_IMAGE, Color.ORANGE, IMAGE_Z_OFFSET); + OverlayUtil.renderActorOverlayImage(graphics, npc, plugin.getClueScrollImage(), Color.ORANGE, IMAGE_Z_OFFSET); } } } @@ -229,7 +227,7 @@ public class HotColdClue extends ClueScroll implements LocationClueScroll, Locat return; } - OverlayUtil.renderTileOverlay(plugin.getClient(), graphics, localLocation, SPADE_IMAGE, Color.ORANGE); + OverlayUtil.renderTileOverlay(plugin.getClient(), graphics, localLocation, plugin.getSpadeImage(), Color.ORANGE); } } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java index a032e3c894..fd2b65f874 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java @@ -40,8 +40,6 @@ import static net.runelite.api.ObjectID.CRATE_6616; import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; -import static net.runelite.client.plugins.cluescrolls.ClueScrollPlugin.CLUE_SCROLL_IMAGE; -import static net.runelite.client.plugins.cluescrolls.ClueScrollPlugin.SPADE_IMAGE; import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.CLICKBOX_BORDER_COLOR; import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.CLICKBOX_FILL_COLOR; import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.CLICKBOX_HOVER_BORDER_COLOR; @@ -179,14 +177,14 @@ public class MapClue extends ClueScroll implements ObjectClueScroll OverlayUtil.renderHoverableArea(graphics, gameObject.getClickbox(), mousePosition, CLICKBOX_FILL_COLOR, CLICKBOX_BORDER_COLOR, CLICKBOX_HOVER_BORDER_COLOR); - OverlayUtil.renderImageLocation(plugin.getClient(), graphics, gameObject.getLocalLocation(), CLUE_SCROLL_IMAGE, IMAGE_Z_OFFSET); + OverlayUtil.renderImageLocation(plugin.getClient(), graphics, gameObject.getLocalLocation(), plugin.getClueScrollImage(), IMAGE_Z_OFFSET); } } } // Mark tile else { - OverlayUtil.renderTileOverlay(plugin.getClient(), graphics, localLocation, SPADE_IMAGE, Color.ORANGE); + OverlayUtil.renderTileOverlay(plugin.getClient(), graphics, localLocation, plugin.getSpadeImage(), Color.ORANGE); } } diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/cluescrolls/clue_scroll.png b/runelite-client/src/main/resources/net/runelite/client/plugins/cluescrolls/clue_scroll.png deleted file mode 100644 index c4f28ce63b1136ba1cc36c24b93b69bcb5c4aae6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15191 zcmeI3eN%vAiOugfl#pRnOtrza7&UKk{c4J z^Ek0u+|F9H-4H$XIG3?nU$;|jOMN*`oZDG9l᳎Tet3{6@4tuQbxk*SKLhxyK z`sd9#x%u%t-|z4D+|TpE{pWU9RTL*lQY9FMC6$(#s===meA5!=fGc+Dm<(L!I!ji$ zG3=3K;Twnb?o7e3+$UK}JzsBrnxr|qg0garjKXJk3MNdy(&wb;R)&{0GR>^RAiL3j zLMCOc23eiftTa0dm=?CA)5X+uR#@oHR$6D3tu#vXJ`yCbGdv~r*=-It=`+Xzc}Wlp z&A3b&knpVrS)Nc(T5qnB7H}>`s#RpmX+oVV&Cw|ctu9xkSs_&^iELb{!wHRCNsvk% zsU)PKkIX0mk=|u(BCAbBp>p6agRF(;og|KXy9eEIHA+&aHR@YspLQ*cXv2= z$|rZYGlEGb^OzVn?P8rg%Q>V%UaFDv@CKPoC=~vL?#u2B7jn2m>;OgFM>%mqp~PdE ztaRAp^tfz+p;>91u`zbW!MlNvi0N~-a6IR3;btfq?w+wQm=m)(Ts!7??e>_Z-F#s? zKoCM2)9JQ!I2pW}adRFQ%@nqSTgixZ_dMGanVcz^gq|74&iL3FY(h`a7FY_w8PbD$ zB@0{(#d9tT$Jva*RaP~LP+CwRtg0O8Q+2Gv%6Z+(^mw!-GT)JGjEUkIBXH)*m1;Sm zv#6A$N<*qtS;E3pLP>(ks2pa_$~JYx%AqB-N;n6kjLre}kCo!7uapJWLV2t-*~Gc* z6mMkhR5OD+9nE??(g-QTtBNe(Y@7=Wi!rM8c&ui~6Y8cMFVHY(+6m8MBfH8HeYt5q?ys)2-fft^cIv~ZdkX<&JS*O~f)9Z2J^tZ87CnDH7b$%vS?DYB63x^sB)&dw86_^7; zk56lhR1WIvg*ml(0{R@45`1t%xQ487ceHiY!>w?4v^CTViWpV7uo3DA8G};={W}lL zWUv)HEP&?}Jp7hSP~fU>e9+#Dzoz3q)Kn4P-3hLL!0%A}*K) zG8S-~7I7gF!2%H%OamE5>ED&+QG?1}~3yBC8h`3-H$XLXM zL<9>&Trdq}EaE~Uf(0TjmM zP)e6nn=!026T{YZVc6XV;P*2O^C&UwY6FImJs7r#+q!z72*cv{mzwe{zTwk9TirTb zm2&2ToSPZ9*B58<*{p{xCONacPmy@Z_FB|$3 zM|!s1A9~xG@J9cJk^jCw^8O9oyBE%vpUmHm$8Fh@uBpAf-}Rw1zUT)FX7#T>d(L@n zA#rDO&tpVZVq8I8@yE;Qf7cRs8rMBvaq?N?D{rq^y#2M6F3p8kQ-5xpHI~xQP^aWQ z_dd7L`6fO|_uRVUwP%vvyjaI2B+FziS&74C3pWwjOWq@|-y_#1NPcyE!=R;&y|KG_ z^cT&e#<;Dvk6x$fv9srtxAsoB-)#JF*>3Ljw*Rd81iRjKy4O>d@?zn=Lpg(5>k&`Z zEKu{xBGtYkFzSo_{STfp{bhK-e{9pLz72C9ZyUA!M*hgKWaEM3-#&e6&8Js;R-f(p zV*dIgr~b4J8@cjmf-+qOia&Ss(~kacl4M35LPKoB#61wOq?g8Y@6Dzy9>B|FdmZ?*HMA!9O%~ zY@T`i-NW*R6SwAM9Q>muT{a68Eg#)w>q;4av2(?j^Sv9_;Ws|MbnW-vL#eZ${$cm_ z{#`lev{r?dxH{2pxqLf*Z1(AY_9ZPnxJ>1*si`^YSNqF%rTs1I!lIjVGv(biq)uyS zeId8?g@aqx9=`O--L~F}$`2~%9d&lTGv4sUq7w@y+Pm|%`uniI|9L4uviq&yzVTqw z`Ge1VSJI%ByyN+C+DUcIbx+>Dq91j~PZaxYi=ZbGLf)_rEvy z6YaphxW+_@bIqaqE3t{bx}wVQk!QVk$GzB>kL~TaSp4dk@ak)6VTI{He#83z0S7AW A!vFvP diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/cluescrolls/spade.png b/runelite-client/src/main/resources/net/runelite/client/plugins/cluescrolls/spade.png deleted file mode 100644 index 092326b31f299f50017c148a94a233c98094ca54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15302 zcmeI3eQXnD9LH}s9ZV-g1tu@crLZ`|+Pmv}&#o}m;RbZ_GGq%ucD+8`F0{SUyU}h) zco{EZz!8iC5lkSy5F<(q0TBXXGBF`yAebl^68OUa8A4>n8Sv$~wrg+Cx+haH{_`|x z?|#qk`F@|f&-47A-aofxUfuIWg%b)XiYltD@h*VJN$@*y-;%PoX=(LxV6-1v(K9MHD_!VMzM&@LX$V z40N)Ky1c?rsSQXs_~y}7atzQmlietC7ANg+nK+xvX||TrW|p%vtc&5SMwa7Q7teBZ z`eX1E!ZUX)5abtlXQhXOQH7yJRiiw^#N%;O++vbr%?#&qxfs^Wn9WAm!>F`HR3TxE zC{t1<{XSlxh%qUuN^*qOd$(%??sz5<-;WOe~X26c96- zXlpE#ytIJGfDj0Sh^jyxms1yQkyTk~k%t&ElOA$lI43?|X6&5T8xH3jT2ZT4LIi1~ zIh9I%TNE%0fFifXL{PmF-pZ6*cdtsp?Bon^(lSF{J4i@F$h1sKmRt&{8FIsW<*Q;q zP~}*?EQdU)RW`35Azf9atttmywpfY;Xt|wlGUw5Y6<;NXAZojrN7M=e1l-Jk z*6d|vlxdkXcmjt`ZIWL{4F&PUz4J zb&0evHC4I?v1ARVTH#|Je8OZhkC=nXGqa05$dl|HJxEu?iwuGQ!G{DFo)3~GxDX)t zkl@1eL9zrF0t6otTzEc6mf%8w;6s87&j-m8TnG?+NO0l#AX$P70fG++E<7J3OK>4T z@FBs4=YwPkE(8cZB)IT=kSxK40Kta@7oHE2CAbhE_>kbj^Fgu%7Xkzy5?pvbNS5G2 zfZ#)d3(p715?lxnd`NKN`5;+>3ju-;2`)SzBuj81K=2{Kh3A802`&T(J|wvCe2^@` zg#f{a1Q(tUk|nqhAo!5r!t+701Q!AX9}--6K1i0}LV(~yEUv=rOPe49-_(r5S2Fun z`McrkoU~Z8z(-N-r4+TcgQ9->6CQ6+R4YqSH=8Jm-$ha5pSX15 z+sZj3=8q}3^Lu_tiF?eru61>jH~eylp1p&fR-WIP-?)9_)~VY=-#7R>%Gk;cpUf$n zpD1I_?>l+*R7dE|+TvS19mmdfI^^Kn@0GrMvvkXh8!fKJ!yhz$3Px?adtm*HGv|dT zP9L0|7`x>~+u6;0S6}{I!vSO7(em>v)RK$mzFAj&c-Ps_kK~W&Uc1{HEzest=Fr^{ zmybR6>RV4I#*TWutc^7-J8qXJd~CSdReH&`DgNQksh>T^@87g;T4&RRUz<*!TiQ|3 zP_l8xYN1CNUp9HC@7kG3bLbyz7rL+g*wo!~V#Y<5{qAzj=!ri)^Gfx;&a&P$Q}1>@ zzG98zi?8z@I-cj+gY_VNd!BmMnT{Tu<*iXFL9Q zcuxM(qkHCG7wvnS?0fHz?peC$;I`7AZ|(B-6>XE>xL&wqqiJUOJ#*dtUT1J~*OV`< duk{sE?+5q4`_z@MV%nRwwbgark7hQl{|hxezZ(Dm From 99e2d766d6b8d33095b58b8c14e60d18ae439c88 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Wed, 18 Jul 2018 16:27:24 -0700 Subject: [PATCH 09/17] death indicator plugin: Use Item IDs for overlays --- .../deathindicator/DeathIndicatorPlugin.java | 58 ++++++++++++------ .../deathindicator/DeathWorldMapPoint.java | 54 ++++++---------- .../client/plugins/deathindicator/bones.png | Bin 574 -> 0 bytes 3 files changed, 57 insertions(+), 55 deletions(-) delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/deathindicator/bones.png 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 a739568db1..b2ab4fd7a0 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 @@ -39,6 +39,7 @@ import lombok.extern.slf4j.Slf4j; import static net.runelite.api.AnimationID.DEATH; import net.runelite.api.Client; import net.runelite.api.GameState; +import net.runelite.api.ItemID; import net.runelite.api.Player; import net.runelite.api.coords.WorldPoint; import net.runelite.api.events.AnimationChanged; @@ -46,6 +47,7 @@ import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameTick; import net.runelite.client.config.ConfigManager; +import net.runelite.client.game.ItemManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; @@ -66,7 +68,6 @@ public class DeathIndicatorPlugin extends Plugin 12342, // Edgeville 11062 // Camelot ); - static BufferedImage BONES; @Inject private Client client; @@ -80,27 +81,17 @@ public class DeathIndicatorPlugin extends Plugin @Inject private InfoBoxManager infoBoxManager; + @Inject + private ItemManager itemManager; + + private BufferedImage mapArrow; + private Timer deathTimer; private WorldPoint lastDeath; private Instant lastDeathTime; private int lastDeathWorld; - static - { - try - { - synchronized (ImageIO.class) - { - BONES = ImageIO.read(DeathIndicatorPlugin.class.getResourceAsStream("bones.png")); - } - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } - @Provides DeathIndicatorConfig deathIndicatorConfig(ConfigManager configManager) { @@ -133,7 +124,7 @@ public class DeathIndicatorPlugin extends Plugin if (config.showDeathOnWorldMap()) { worldMapPointManager.removeIf(DeathWorldMapPoint.class::isInstance); - worldMapPointManager.add(new DeathWorldMapPoint(new WorldPoint(config.deathLocationX(), config.deathLocationY(), config.deathLocationPlane()))); + worldMapPointManager.add(new DeathWorldMapPoint(new WorldPoint(config.deathLocationX(), config.deathLocationY(), config.deathLocationPlane()), this)); } } @@ -204,7 +195,7 @@ public class DeathIndicatorPlugin extends Plugin if (config.showDeathOnWorldMap()) { worldMapPointManager.removeIf(DeathWorldMapPoint.class::isInstance); - worldMapPointManager.add(new DeathWorldMapPoint(lastDeath)); + worldMapPointManager.add(new DeathWorldMapPoint(lastDeath, this)); } resetInfobox(); @@ -290,7 +281,7 @@ public class DeathIndicatorPlugin extends Plugin if (config.showDeathOnWorldMap()) { worldMapPointManager.removeIf(DeathWorldMapPoint.class::isInstance); - worldMapPointManager.add(new DeathWorldMapPoint(deathPoint)); + worldMapPointManager.add(new DeathWorldMapPoint(deathPoint, this)); } } else @@ -328,10 +319,37 @@ public class DeathIndicatorPlugin extends Plugin Duration timeLeft = Duration.ofHours(1).minus(Duration.between(config.timeOfDeath(), now)); if (!timeLeft.isNegative() && !timeLeft.isZero()) { - deathTimer = new Timer(timeLeft.getSeconds(), ChronoUnit.SECONDS, BONES, this); + deathTimer = new Timer(timeLeft.getSeconds(), ChronoUnit.SECONDS, getBonesImage(), this); deathTimer.setTooltip("Died on world: " + config.deathWorld()); infoBoxManager.addInfoBox(deathTimer); } } } + + BufferedImage getMapArrow() + { + if (mapArrow != null) + { + return mapArrow; + } + + try + { + synchronized (ImageIO.class) + { + mapArrow = ImageIO.read(getClass().getResourceAsStream("/util/clue_arrow.png")); + } + } + catch (IOException e) + { + throw new RuntimeException(e); + } + + return mapArrow; + } + + BufferedImage getBonesImage() + { + return itemManager.getImage(ItemID.BONES); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathWorldMapPoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathWorldMapPoint.java index 2ef3557965..e6368d87ce 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathWorldMapPoint.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/deathindicator/DeathWorldMapPoint.java @@ -26,56 +26,40 @@ package net.runelite.client.plugins.deathindicator; import java.awt.Graphics; import java.awt.image.BufferedImage; -import java.io.IOException; -import javax.imageio.ImageIO; import net.runelite.api.Point; import net.runelite.api.coords.WorldPoint; -import static net.runelite.client.plugins.deathindicator.DeathIndicatorPlugin.BONES; import net.runelite.client.ui.overlay.worldmap.WorldMapPoint; class DeathWorldMapPoint extends WorldMapPoint { - private static final BufferedImage WORLDMAP_HINT_ARROW; - private static final Point WORLDMAP_HINT_ARROW_POINT; + private final DeathIndicatorPlugin plugin; + private final BufferedImage worldmapHintArrow; + private final Point worldmapHintArrowPoint; - static - { - BufferedImage MAP_ARROW; - try - { - synchronized (ImageIO.class) - { - MAP_ARROW = ImageIO.read(DeathWorldMapPoint.class.getResourceAsStream("/util/clue_arrow.png")); - } - } - catch (IOException e) - { - throw new RuntimeException(e); - } - - WORLDMAP_HINT_ARROW = new BufferedImage(MAP_ARROW.getWidth(), - MAP_ARROW.getHeight(), BufferedImage.TYPE_INT_ARGB); - - Graphics graphics = WORLDMAP_HINT_ARROW.getGraphics(); - graphics.drawImage(MAP_ARROW, 0, 0, null); - graphics.drawImage(BONES, 0, 1, null); - WORLDMAP_HINT_ARROW_POINT = new Point(WORLDMAP_HINT_ARROW.getWidth() / 2, WORLDMAP_HINT_ARROW.getHeight()); - } - - DeathWorldMapPoint(final WorldPoint worldPoint) + DeathWorldMapPoint(final WorldPoint worldPoint, final DeathIndicatorPlugin plugin) { super(worldPoint, null); + + worldmapHintArrow = new BufferedImage(plugin.getMapArrow().getWidth(), plugin.getMapArrow().getHeight(), BufferedImage.TYPE_INT_ARGB); + Graphics graphics = worldmapHintArrow.getGraphics(); + graphics.drawImage(plugin.getMapArrow(), 0, 0, null); + graphics.drawImage(plugin.getBonesImage(), 0, 0, null); + worldmapHintArrowPoint = new Point( + worldmapHintArrow.getWidth() / 2, + worldmapHintArrow.getHeight()); + + this.plugin = plugin; this.setSnapToEdge(true); this.setJumpOnClick(true); - this.setImage(WORLDMAP_HINT_ARROW); - this.setImagePoint(WORLDMAP_HINT_ARROW_POINT); + this.setImage(worldmapHintArrow); + this.setImagePoint(worldmapHintArrowPoint); this.setTooltip("Death Location"); } @Override public void onEdgeSnap() { - this.setImage(BONES); + this.setImage(plugin.getBonesImage()); this.setImagePoint(null); this.setTooltip(null); } @@ -83,8 +67,8 @@ class DeathWorldMapPoint extends WorldMapPoint @Override public void onEdgeUnsnap() { - this.setImage(WORLDMAP_HINT_ARROW); - this.setImagePoint(WORLDMAP_HINT_ARROW_POINT); + this.setImage(worldmapHintArrow); + this.setImagePoint(worldmapHintArrowPoint); this.setTooltip("Death Location"); } } diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/deathindicator/bones.png b/runelite-client/src/main/resources/net/runelite/client/plugins/deathindicator/bones.png deleted file mode 100644 index 90ff52f20862eb2c32088c42aa0ab0b219c1f75a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 574 zcmV-E0>S->P)5|4b-0j3OF+upz7{opp4X1 z{#?;&e_J)tCIJqs6}s^;$?xNh4MaYZa1j6f9o(0fI5!&EvZlME3rN|hl#-fR*;%d z&`BNoKGxsI2iaX&hG~C~Roq^fk5W5sE2CeO%1;d`XCGNaR{`BuWrc-uOkHe9(L$QQ zSV5MCTHt#tJuNK}K;e^ Date: Wed, 18 Jul 2018 17:13:51 -0700 Subject: [PATCH 10/17] fight caves plugin: Use Sprite IDs for overlay images --- .../plugins/fightcave/FightCaveOverlay.java | 50 +++--------------- .../resources/prayers/protect_from_magic.png | Bin 254 -> 0 bytes .../prayers/protect_from_missiles.png | Bin 220 -> 0 bytes 3 files changed, 7 insertions(+), 43 deletions(-) delete mode 100644 runelite-client/src/main/resources/prayers/protect_from_magic.png delete mode 100644 runelite-client/src/main/resources/prayers/protect_from_missiles.png diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCaveOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCaveOverlay.java index cb718637da..b1b33e724e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCaveOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCaveOverlay.java @@ -28,11 +28,11 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.image.BufferedImage; -import java.io.IOException; -import javax.imageio.ImageIO; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; +import net.runelite.api.SpriteID; +import net.runelite.client.game.SpriteManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; @@ -47,17 +47,17 @@ public class FightCaveOverlay extends Overlay private final Client client; private final FightCavePlugin plugin; + private final SpriteManager spriteManager; private final PanelComponent imagePanelComponent = new PanelComponent(); - private BufferedImage protectFromMagicImg; - private BufferedImage protectFromMissilesImg; @Inject - private FightCaveOverlay(Client client, FightCavePlugin plugin) + private FightCaveOverlay(Client client, FightCavePlugin plugin, SpriteManager spriteManager) { setPosition(OverlayPosition.BOTTOM_RIGHT); setPriority(OverlayPriority.HIGH); this.client = client; this.plugin = plugin; + this.spriteManager = spriteManager; } @Override @@ -83,43 +83,7 @@ public class FightCaveOverlay extends Overlay private BufferedImage getPrayerImage(JadAttack attack) { - return attack == JadAttack.MAGIC ? getProtectFromMagicImage() : getProtectFromMissilesImage(); - } - - private BufferedImage getProtectFromMagicImage() - { - if (protectFromMagicImg == null) - { - String path = "/prayers/protect_from_magic.png"; - protectFromMagicImg = getImage(path); - } - return protectFromMagicImg; - } - - private BufferedImage getProtectFromMissilesImage() - { - if (protectFromMissilesImg == null) - { - String path = "/prayers/protect_from_missiles.png"; - protectFromMissilesImg = getImage(path); - } - return protectFromMissilesImg; - } - - private BufferedImage getImage(String path) - { - BufferedImage image = null; - try - { - synchronized (ImageIO.class) - { - image = ImageIO.read(FightCaveOverlay.class.getResourceAsStream(path)); - } - } - catch (IOException e) - { - log.warn("Error loading image", e); - } - return image; + final int prayerSpriteID = attack == JadAttack.MAGIC ? SpriteID.PRAYER_PROTECT_FROM_MAGIC : SpriteID.PRAYER_PROTECT_FROM_MISSILES; + return spriteManager.getSprite(prayerSpriteID, 0); } } diff --git a/runelite-client/src/main/resources/prayers/protect_from_magic.png b/runelite-client/src/main/resources/prayers/protect_from_magic.png deleted file mode 100644 index b71e1d395f683ca6150ae39b926c29d074e1555a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 254 zcmV8GPN`dnpChx$8M{uAowI;xEI0b!SxPD#W9s{jB107*qoM6N<$ Eg4{1=YybcN diff --git a/runelite-client/src/main/resources/prayers/protect_from_missiles.png b/runelite-client/src/main/resources/prayers/protect_from_missiles.png deleted file mode 100644 index 210e0ff6d639b57de416f970b83b1573e2abd54b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gji#=T&Ln>}1CoEtvFf#aayiIZi zV?x{7lD&Z)Rv&8D{;EOR4Kragx$ZHBpPTvlJLQZY}t? UbQRlWpmP~KUHx3vIVCg!02zE#GXMYp From ef4ce9708efba988b3e8f95c161f2dbac6999657 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Tue, 17 Jul 2018 23:56:54 -0700 Subject: [PATCH 11/17] hiscores plugin: Remove duplicate skill icon images --- .../client/plugins/hiscore/HiscorePanel.java | 14 +++++++++++++- .../plugins/hiscore/skill_icons_small/agility.png | Bin 203 -> 0 bytes .../plugins/hiscore/skill_icons_small/attack.png | Bin 225 -> 0 bytes .../plugins/hiscore/skill_icons_small/combat.png | Bin 465 -> 0 bytes .../hiscore/skill_icons_small/construction.png | Bin 216 -> 0 bytes .../plugins/hiscore/skill_icons_small/cooking.png | Bin 220 -> 0 bytes .../hiscore/skill_icons_small/crafting.png | Bin 220 -> 0 bytes .../plugins/hiscore/skill_icons_small/defence.png | Bin 190 -> 0 bytes .../plugins/hiscore/skill_icons_small/farming.png | Bin 373 -> 0 bytes .../hiscore/skill_icons_small/firemaking.png | Bin 240 -> 0 bytes .../plugins/hiscore/skill_icons_small/fishing.png | Bin 240 -> 0 bytes .../hiscore/skill_icons_small/fletching.png | Bin 201 -> 0 bytes .../hiscore/skill_icons_small/herblore.png | Bin 222 -> 0 bytes .../hiscore/skill_icons_small/hitpoints.png | Bin 223 -> 0 bytes .../plugins/hiscore/skill_icons_small/hunter.png | Bin 277 -> 0 bytes .../plugins/hiscore/skill_icons_small/magic.png | Bin 231 -> 0 bytes .../plugins/hiscore/skill_icons_small/mining.png | Bin 212 -> 0 bytes .../plugins/hiscore/skill_icons_small/overall.png | Bin 291 -> 0 bytes .../plugins/hiscore/skill_icons_small/prayer.png | Bin 321 -> 0 bytes .../plugins/hiscore/skill_icons_small/ranged.png | Bin 258 -> 0 bytes .../hiscore/skill_icons_small/runecraft.png | Bin 251 -> 0 bytes .../plugins/hiscore/skill_icons_small/slayer.png | Bin 546 -> 0 bytes .../hiscore/skill_icons_small/smithing.png | Bin 237 -> 0 bytes .../hiscore/skill_icons_small/strength.png | Bin 232 -> 0 bytes .../hiscore/skill_icons_small/thieving.png | Bin 169 -> 0 bytes .../hiscore/skill_icons_small/woodcutting.png | Bin 240 -> 0 bytes .../skill_icons_small/bounty hunter - hunter.png | Bin .../skill_icons_small/bounty hunter - rogue.png | Bin .../skill_icons_small/clue scrolls (all).png | Bin .../skill_icons_small/last man standing.png | Bin 30 files changed, 13 insertions(+), 1 deletion(-) delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/agility.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/attack.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/combat.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/construction.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/cooking.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/crafting.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/defence.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/farming.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/firemaking.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/fishing.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/fletching.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/herblore.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/hitpoints.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/hunter.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/magic.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/mining.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/overall.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/prayer.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/ranged.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/runecraft.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/slayer.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/smithing.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/strength.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/thieving.png delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/woodcutting.png rename runelite-client/src/main/resources/{net/runelite/client/plugins/hiscore => }/skill_icons_small/bounty hunter - hunter.png (100%) rename runelite-client/src/main/resources/{net/runelite/client/plugins/hiscore => }/skill_icons_small/bounty hunter - rogue.png (100%) rename runelite-client/src/main/resources/{net/runelite/client/plugins/hiscore => }/skill_icons_small/clue scrolls (all).png (100%) rename runelite-client/src/main/resources/{net/runelite/client/plugins/hiscore => }/skill_icons_small/last man standing.png (100%) 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 c669337aa4..f09412171c 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 @@ -328,7 +328,19 @@ public class HiscorePanel extends PluginPanel label.setFont(FontManager.getRunescapeSmallFont()); label.setText("--"); - String skillIcon = "skill_icons_small/" + (skill == null ? "combat" : skill.getName().toLowerCase()) + ".png"; + String skillName = (skill == null ? "combat" : skill.getName().toLowerCase()); + String directory = "/skill_icons"; + if (skillName.equals("combat") || skillName.equals("overall")) + { + // Cannot use SpriteManager as HiscorePlugin loads before a Client is available + directory += "/"; + } + else + { + directory += "_small/"; + } + + String skillIcon = directory + skillName + ".png"; log.debug("Loading skill icon from {}", skillIcon); try diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/agility.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/agility.png deleted file mode 100644 index 19c26d9022e735cf728a217473960dfad46c07ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|t_%#v!o013JhwA9*?<&d zNswPKgTu2MX&_FLx4R2N2dk_HNO^%rWHAE+w=f7ZGR&GI0TlG}ba4#fxXycOBj*7H z373cNUf(xdsGXAVzxkwy-ohnY1dnJIpJhL8+rj(cQIvFy*6azN+TWK6zgcNv9sE9I q`>GeNA5ZX34_6j>7=N~c&;IWtkv(40dzS%CX7F_Nb6Mw<&;$S~A3y&9 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/attack.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/attack.png deleted file mode 100644 index 4d9aaa87f655a5fbae8b023eaa946b20099c60f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv4DbnY1=4Od`nz{BSL7u|1vm$| zS*Aq!HdSPoS96w^mjh+hPql*dFqQ=Q1v5B2yO9RsBze2LFm$lWdH^|`1s;*b3=G`D zAk4@xYmNj^(8troF@)oKasoqh=xPO%>!%_E8fR`^z+@bLkVVXaMQb6`K0gajo zjO#+Rl@Bt-$Vvr>YEMzn+QDKi<}ih8U4wzx+9+1h#sD6M!qal46Zd^61e(j>>FVdQ I&MBb@0PW*DzW@LL diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/combat.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/combat.png deleted file mode 100644 index b1e17fb28d076029db6b9713665a223fe83932de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 465 zcmV;?0WSWDP)5Iy^gqHS~vZ5vq#r(qny0gMHai7>SK;txU)0&_J(Vm>l+5q2^i->qqf_4d`-VMxPuX z>RKg=QJ4;xra$(X-~YJSqjh5xi)mf~ou3*LQ5Zepkb}InI9!~gJG%#nLIBXk!Wzym z;WnE39}_+?p4Y4E+lVG3QTnWWhyCzSZ?u^2(j4b#5>nXDQOc#F<=JircjrwxD9?37 z>9yq#V)v)w%0c;SOR!W&xUnD0#mNfv>9ZZ9FyrzRw*hKD=dB$M`Lhkl00000NkvXX Hu0mjfBpBBE diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/construction.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/construction.png deleted file mode 100644 index 3c8e176a3ed491cd69b4a13d73e76ffa31269a66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZ{r~?zkU4YaOdyq(mUiOA ziJv_-ucsHu07V%~g8YIR9G=}s196hP-CYEal|aXmTV0KWt)E2|`nqk^vPL`M@76OW@20%ro6jG7#HoE4lsJ&)cLIKdGV6vSjK zGIdJJoL*kZ7M2zf$=DbfNft>7)&@4N2OIer+C+JrdUpmT0gYzxboFyt=akR{03%#F AHvj+t diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/cooking.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/cooking.png deleted file mode 100644 index 2030f1d25bea66f72b100557d8073322444c4592..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VWP0r8x{{8N<9)Z{Z!RmBQ zps-X}bs3OiED7=pW^j0RBMrn!@^*J&=wOxg0CG4BJR*x37`TN&n2}-D90{Ocn5TjR${J7F`2FYG@IS`Ex9%oKE3+n$J= z`E$YT2-}&htEbLp+EjFQbEt)MxJ%Efpz|;6)5_pI;wmpM2a4TF zw4Vl~7)yfuf*Bm1-ADs*lDyqr7&=&GJ%Aj}0*}aI1_o|n5N2eUHAey{80qQa7{YPg zwf7+J0Rs-^zX^>Va}`dpon$bn_&+o2vnGFuSpq}ohG-=}E;hm2uWF65vQIc(v)fP_ z&Y2Q>=|VK$1F4&t_!@hljQC0!qCAg>jC6&7I;J!Gca%qgD@k*tT_@uL2FMJ#}JO| z$q5b2;sy*xGOWG5Q$rkh5-koNkrZcM!a21udLwrSgTe~DWM4fF@ZFy diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/farming.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/farming.png deleted file mode 100644 index 0b9becd5f51ffba87569075aa7d6b4ef5adb3f1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}QGic~E08WskE+Q}D$9y%tITSv z%&93zDoBfLC{1rDNe@Zfo>X`_I_p?*W=utHd|_HtV`+MKZGKr+d__)tOxE%4y8ME) zsF!asJM zJe(=f9HDG*nagDQ#)_p=qo4P`3156d^g_vsO!Gq5n7@oH+@jJBhZofVoyOql>gTe~ HDWM4fvQdc! diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/firemaking.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/firemaking.png deleted file mode 100644 index a9297c8edcc81b99e73e8cbd0ec4635f8ad93631..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VWP0r8RY{`7rpK;v^)(9&e zpzz^}^1DEau_VYZn8D%MjWiG^$=lt9p@UV{1IXbl@Q5sCVBi)8VMc~ob0mO*S)MMA zAsp9D`wsFt8*(`BG;sK&o)O6Au_%Y(`wQXs`@QbQPi_9{Fs-+PW5dctCpc@qPi;FI zz3n&e?M0c3{hD9wsG3>Y`R$k1x8^uE#guNbFC2aH=_(FfYI5b1*cHtj8ZIwazp-;Z c`xATl0|65L|5?hFfVMJty85}Sb4q9e0NkEW8vpEal| zab30NAnySM9_GIp><=!oHbpc{sbAVwuUYXwRBDC%Hqp7v2Rxd)bz7R5GuS1aK5=i{ ztoFx9FU#Wn&eFG4RX0PotWnB8Cwx!Bl}ju8%%lDJOTDxlLVdsWd8RC~FBZ|ivDNMJ aN5)M|B3w0_7+(TyW$<+Mb6Mw<&;$S|g-ied diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/fletching.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/fletching.png deleted file mode 100644 index 56b50c406751596f865f75a4d55efd3bcf827c2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?bO)b%F(c@65=Cs%228vbf zWYz&vj3q&S!3+-1Zlr-YN#5=*3>~bp9zYIffk$L90|U1(2s1Lwnj--ebn|p^4B@z5 z+q+TlfC3M5tU>2t78z!N&%e*NBnP@LfApUFq|Rl7);h&sp@uHG)~r4=R8LHcxLNPW mS>5Tb{3Bvnwzx`d0mJ_g{=5yJPEG)t$l&Sf=d#Wzp$PzSi8%)V diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/herblore.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/herblore.png deleted file mode 100644 index fde27351c406beb4c5357c1762ea2575bd2c3f47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZ%`eJjc+bF4&A@P#fng;B zLmE(mK{)8H4Ul3i3GxeOaCmkDB*>WL?e4vL>4nJa0`PlBg3pY5YR7 zVY6fp<1)rBi`j-74oYSo^K(3x=I}R1)6Y>aLHTln0%Lb8L$8$R`HWZRlz|p7c)I$z JtaD0e0s#F0K$8Ff diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/hitpoints.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/hitpoints.png deleted file mode 100644 index bf431f7518a0b82655a38783bbbafd8e6d47bef2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VWP0r8RY{^_@%gMmN2o$^P z&nT}P@Ce9aED7=pW^j0RBMrn!@^*J&=wOxg0CG4BJR*x37`TN&n2}-D90{Ocq^FBx z2*>s0ga$^j6{1?Pa1 zGa3&Dh#WCUNGLE9Vd1i1&}B5_aoA=l?Z_e_;Si?8z_2Stw25s-N*2%(22WQ%mvv4F FO#s-PGmQWM diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/hunter.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/hunter.png deleted file mode 100644 index 88be793bbb425a8b56d02f912e891f6e54c73665..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}cz{octG2X^hLp6HjI5r#lAeOH zzM_i0lA4*GftIY2fwG3CtdgFRx}lnuftr@7hQ5`qiIuvEsjjiPmWi&0wz7;e&=^r^ zAvJ9o1w~;kZFxya$^ZZV0|k4-@0|crj3q&S!3+-1Zlr-YN#5=*3>~bp9zYIffk$L9 z0|U1(2s1Lwnj--e^zw9Z43W58+tk|D{vdl%y;Rbvs`Q^%k9H zSZu=_*LY#y!nM;k{mm;)NQ!jX_{{QVKU4D=$>(3)1*CjD{<3+kvL>4nJa0`PlBg3pY5 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/mining.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/mining.png deleted file mode 100644 index 57430882d0ecc3f2dde4c7e188e2098cbc2d7dcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9JOMr-uBp1|ZZ`U*)ipo?PlIcs zK#H*>$S;_|;n|He5GTpo-G!lpRn`N@;VkfoEM{Qf76xHPhFNnYfPx{OE{-7_*LhEF z0DLY40fK2)lo~lxbE}1kZ+5OcvbC9E9JgVe8RR0Xg-6dtDnm{r-UW|g#|!p diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/overall.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/overall.png deleted file mode 100644 index 4b2dd265a4970c6dd20f2310d2a01face8528074..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 291 zcmV+;0o?wHP)8)*1)|sakAQ)o06ohsUc_xqFow-Hs=VUEoX-s`UZWqi${3Dvr}KO!i4|g zoxeMdLm`AA1>>CV`yKY7JARO^`j)~78P{KRfB?TNX8`r^AcyH`!*#IhO`G8u1C$Ri8>d}T+s#_qekUCxh+^Ym*Zw_@>sW;2 p%-exutS;_YuFU*t4f&mfcmb@^ed{f`g=hc(002ovPDHLkV1m;;ef$6b diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/prayer.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/prayer.png deleted file mode 100644 index 7c348987ebd24249442ad5a685ef1b90647d654a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 321 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}RDe&2D?>SmDJ;x8b;G=An-d+33$HF+`*=e}YdJ5_XvUHtzhDN3XE)M7oFs2| z7lsa2Sq~tGv%n*=n1O*?7=#%aX3dcR3Ko01IEF}Ej_r@;Yc}9v*=*z6uw+V8?1At5 z)s}d;p8Hd&a(nl=zYGs}1hfNAXYgo!G$_`r{ci3MYJU6At9OSpb!I!KzT4~1b-z0{ zv~sTplj4!o%cV+-s#j_}N`IJ{F~6W=;!4wc=E=O@o++L_SGjY~+ryk2Ke62IWvROc Pw4TA!)z4*}Q$iB}C~@@x5%^$J=BKE11ej$rU~^>bP0l+XkKgc4O= diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/runecraft.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/runecraft.png deleted file mode 100644 index 2c52ffe9139bc3f027cfa47eb4105e01de262e22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDUO)Oy8V9C;L&N*SigvhAS z^73*921cOdat7<=K#H*>$S;_|;n|He5GTpo-G!lpRn`N@;VkfoEM{Qf76xHPhFNnY zfP(p+E{-7_*L{1f`C1HkT$U@Dp3UnI+sW{VO)REiVVqszt&o#n3q?2|rp-%Jv1cd{ ze0$2=^v3Uc-taHN-Hvis{iB<#c~5lYEz#Pk=r7~cIypps$CWns36gWK{xd4LUiHW2 n%p}*nXI_5&SvYg=jRNK^cVsPC@1AY}TFv0;>gTe~DWM4f0(nxQ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/slayer.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/slayer.png deleted file mode 100644 index f02563044c4ed3021994f92795824bcc79613695..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 546 zcmV+-0^R+IP)Clmt#r zPI`KJxV8l{EGs%QD@{xm{{H?&Jvi&)-R0cYTU%So%F5Qnx$NZNKsPI~n2FBL&d|TJ zprD{bLqkbONWiI^^z`(dn3k=UiPO=~(96h!f(^m9v6_Z@ii8$FKR}+GBK7aLku zHZh}*gU!nVr=|kN$H)5m`RwZG@9E{@)y_&lI!{jyUs6dyH8xB?H@lyWR!l}wQBhi0 zP%SM0ARiq+I3M29%G=DthlT-)i2(or02m1~r2qf`0d!JMQvg8b*k%9#00Cl4M??UK z1szBL000SaNLh0L01FcU01FcV0GgZ_0002NNklE)pQA2j@_swdocGLOm@x1Q^9>YUJCd)&BB17WhbVy2%?)nf3N4e%Xr_Ju zK$c~q@k(N@0-g74PpW5;7rQeg>o%OM?7@862M7NCR<_yxm;OkH}&M25w;xW@MN(M*=9A?&;zf z!f{=<=b&JN0uRgQjSU@Q4ojGv82Jv#D}KA*#aXp}?%bWNMTfQrE}fD!LGRfW9=>NQ zvev{UX4~)JYPLx_BKt03!G1ZTzzgB)ol;~iTQ{67Q#WDu{&wz^g4|5sRNlg%if0d4 YxqgURyuFgE1GJLC)78&qol`;+02AO!y8r+H diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/strength.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/strength.png deleted file mode 100644 index 976c550712da6174c7ef10653c9c7d911790babf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VWP0r78v(aZ@U|cw<>cXZL zps>W7(z!s2u_VYZn8D%MjWiG^$=lt9p@UV{1IXbl@Q5sCVBi)8VMc~ob0mO*NuDl_ zAsp9r&s^j@puppLQNg0&EYs0f4C@OUv)DA6eywUK6hqnKH9L&ur|qwfNh}tw6-nV| UJ}bOy4bV0QPgg&ebxsLQ0Pbr`YybcN diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/thieving.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/thieving.png deleted file mode 100644 index 4aca64fdb09668655b409c219a3b66b893760a65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|uK)l42QqeIEHXsPfj?%=Hx6X z5#j92EaBqp>@0C4EX_AjAX>_l^$@GK!3MU3tDFoG7dX0XZJK`r^)Yz5`njxgN@xNA DP^BvE diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/woodcutting.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/woodcutting.png deleted file mode 100644 index 379d09b76f6365a3cd46be0520ee463fea31a610..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZ%`eKWvgKr0$q-@1!Eal|ab34}BkutP9+v%zwOnEjDGVuU3~UZYOO`eMb?@M<6u0|(I-g z(s_`j$;mro(w+;AkAg)tET^py*z9xks-^oo=XWzZUh64s$~q8Wq3^S!TP% boelgsnW8%nRkrv7tz__Y^>bP0l+XkK$j3-^ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/bounty hunter - hunter.png b/runelite-client/src/main/resources/skill_icons_small/bounty hunter - hunter.png similarity index 100% rename from runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/bounty hunter - hunter.png rename to runelite-client/src/main/resources/skill_icons_small/bounty hunter - hunter.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/bounty hunter - rogue.png b/runelite-client/src/main/resources/skill_icons_small/bounty hunter - rogue.png similarity index 100% rename from runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/bounty hunter - rogue.png rename to runelite-client/src/main/resources/skill_icons_small/bounty hunter - rogue.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/clue scrolls (all).png b/runelite-client/src/main/resources/skill_icons_small/clue scrolls (all).png similarity index 100% rename from runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/clue scrolls (all).png rename to runelite-client/src/main/resources/skill_icons_small/clue scrolls (all).png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/last man standing.png b/runelite-client/src/main/resources/skill_icons_small/last man standing.png similarity index 100% rename from runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/skill_icons_small/last man standing.png rename to runelite-client/src/main/resources/skill_icons_small/last man standing.png From 39ac378f4d71a9d8c5f28ac357213ac23f6bd043 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Wed, 18 Jul 2018 00:09:09 -0700 Subject: [PATCH 12/17] kingdom plugin: Use Item ID for overlay image --- .../kingdomofmiscellania/KingdomPlugin.java | 19 ++++++------------ .../kingdomofmiscellania/teak_chest.png | Bin 1755 -> 0 bytes 2 files changed, 6 insertions(+), 13 deletions(-) delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/kingdomofmiscellania/teak_chest.png diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/kingdomofmiscellania/KingdomPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/kingdomofmiscellania/KingdomPlugin.java index 9da8c27813..09302135f9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/kingdomofmiscellania/KingdomPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/kingdomofmiscellania/KingdomPlugin.java @@ -26,16 +26,16 @@ package net.runelite.client.plugins.kingdomofmiscellania; import com.google.common.collect.ImmutableSet; import com.google.common.eventbus.Subscribe; -import java.awt.image.BufferedImage; -import javax.imageio.ImageIO; import javax.inject.Inject; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.GameState; +import static net.runelite.api.ItemID.TEAK_CHEST; import net.runelite.api.Varbits; import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.VarbitChanged; +import net.runelite.client.game.ItemManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; @@ -57,20 +57,13 @@ public class KingdomPlugin extends Plugin @Inject private InfoBoxManager infoBoxManager; + @Inject + private ItemManager itemManager; + @Getter private int favor = 0, coffer = 0; private KingdomCounter counter; - private BufferedImage counterImage; - - @Override - protected void startUp() throws Exception - { - synchronized (ImageIO.class) - { - counterImage = ImageIO.read(getClass().getResourceAsStream("teak_chest.png")); - } - } @Override protected void shutDown() throws Exception @@ -112,7 +105,7 @@ public class KingdomPlugin extends Plugin { if (counter == null) { - counter = new KingdomCounter(counterImage, this); + counter = new KingdomCounter(itemManager.getImage(TEAK_CHEST), this); infoBoxManager.addInfoBox(counter); log.debug("Added Kingdom Infobox"); } diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/kingdomofmiscellania/teak_chest.png b/runelite-client/src/main/resources/net/runelite/client/plugins/kingdomofmiscellania/teak_chest.png deleted file mode 100644 index 9fc9961b4f3076db19cd59844754f7a3c9000718..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1755 zcmeAS@N?(olHy`uVBq!ia0vp^azHH2!3-p0l+P;zDVB6cUq=Rpjs4tz5?O(K#^NA% zCx&(BWL^R}3dtTpz6=aiY77hwEes65fIHvP03SRQf9QK&T7x-ZfxvrZtiPso!Hhk zxubn*SLd{z?iqc(v-ekHhb2JIkQ*Jox6Je{Iv@f ztXs5b!;&Q%mo440a>cgQtG2IMvvb|Lof|gn-nenk=FR)IZaKJP`=OmXkL=!kbkCk+ z`}Q5*zyIW+gQpH30tebCF&sjm@S&nHFat1@1o;L3AK8E*_&d8QFitrOJR*x382Et6 zobM2$sD@VqP*AeOHKHUqKdq!Zu_%=xATcwqM9*JZOD1Q-&QhtC#KHRD>_bYa=r&aDmHD>~R%pDg0YdhgkDb<6wzY-M{xZI1sv zYI)ya^Je4DrxTes{PvQ$d~0{?0YSD8XIFnOn8N7r+U{xXQt&Ge6~AxSVkQ zLd3M`DG@qYhF|pmLj$6G5_&xStULy{&zMT&u8-~a@6CTHsj2h)#nfe&H?6y0fAhTby*nCQlDmE~ z{TBMad)D_7q4@TG)s`y($z3*e=j0FW$iJGrhb44s&xM1fcmEY!iGF*|=vYOn)!hrm va~+=?tUH@Ln=9`H@1Y&CAF2ZRdFI!@ycKD1?!Q?nsDSWv^>bP0l+XkKr)SEw From 470966d0d6c7a8dacbdd505f9e10dc41e2fc69fe Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Wed, 18 Jul 2018 12:02:00 -0700 Subject: [PATCH 13/17] puzzle solver plugin: Use Sprite ID for overlay image --- .../puzzlesolver/PuzzleSolverOverlay.java | 25 +++++------------- .../client/plugins/puzzlesolver/arrow.png | Bin 144 -> 0 bytes 2 files changed, 6 insertions(+), 19 deletions(-) delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/puzzlesolver/arrow.png diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverOverlay.java index cc82f165cf..9fbdb61629 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/puzzlesolver/PuzzleSolverOverlay.java @@ -33,11 +33,9 @@ import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.image.BufferedImage; -import java.io.IOException; import java.util.Arrays; import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; -import javax.imageio.ImageIO; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; @@ -45,8 +43,10 @@ import net.runelite.api.GameState; import net.runelite.api.InventoryID; import net.runelite.api.Item; import net.runelite.api.ItemContainer; +import static net.runelite.api.SpriteID.MINIMAP_DESTINATION_FLAG; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.game.SpriteManager; import net.runelite.client.plugins.puzzlesolver.solver.PuzzleSolver; import net.runelite.client.plugins.puzzlesolver.solver.PuzzleState; import net.runelite.client.plugins.puzzlesolver.solver.heuristics.ManhattanDistance; @@ -77,18 +77,18 @@ public class PuzzleSolverOverlay extends Overlay private final Client client; private final PuzzleSolverConfig config; private final ScheduledExecutorService executorService; + private final SpriteManager spriteManager; private PuzzleSolver solver; private Future solverFuture; private int[] cachedItems; - private BufferedImage downArrow; private BufferedImage upArrow; private BufferedImage leftArrow; private BufferedImage rightArrow; @Inject - public PuzzleSolverOverlay(Client client, PuzzleSolverConfig config, ScheduledExecutorService executorService) + public PuzzleSolverOverlay(Client client, PuzzleSolverConfig config, ScheduledExecutorService executorService, SpriteManager spriteManager) { setPosition(OverlayPosition.DYNAMIC); setPriority(OverlayPriority.HIGH); @@ -96,6 +96,7 @@ public class PuzzleSolverOverlay extends Overlay this.client = client; this.config = config; this.executorService = executorService; + this.spriteManager = spriteManager; } @Override @@ -426,21 +427,7 @@ public class PuzzleSolverOverlay extends Overlay private BufferedImage getDownArrow() { - if (downArrow == null) - { - try - { - synchronized (ImageIO.class) - { - downArrow = ImageIO.read(PuzzleSolverOverlay.class.getResourceAsStream("arrow.png")); - } - } - catch (IOException e) - { - log.warn("Error loading image", e); - } - } - return downArrow; + return spriteManager.getSprite(MINIMAP_DESTINATION_FLAG, 1); } private BufferedImage getUpArrow() diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/puzzlesolver/arrow.png b/runelite-client/src/main/resources/net/runelite/client/plugins/puzzlesolver/arrow.png deleted file mode 100644 index 904f3c296e9cfc2a154c1735d62ab9cdeccffe74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^{2m+FVdQ&MBb@05~=_jsO4v From 24bc03bb1dcdbd602859fbcbbd70ba26eaad7c34 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Wed, 18 Jul 2018 10:38:36 -0700 Subject: [PATCH 14/17] raids plugin: Use Sprite ID for raids timer --- .../client/plugins/raids/RaidsPlugin.java | 32 ++++-------------- .../client/plugins/raids/raids_icon.png | Bin 3210 -> 0 bytes 2 files changed, 6 insertions(+), 26 deletions(-) delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/raids/raids_icon.png diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java index 1a2cf07cce..42a4b49d55 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java @@ -27,15 +27,12 @@ package net.runelite.client.plugins.raids; import com.google.common.eventbus.Subscribe; import com.google.inject.Binder; import com.google.inject.Provides; -import java.awt.image.BufferedImage; -import java.io.IOException; import java.text.DecimalFormat; import java.time.Instant; import java.util.ArrayList; import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.imageio.ImageIO; import javax.inject.Inject; import lombok.Getter; import lombok.extern.slf4j.Slf4j; @@ -46,6 +43,7 @@ import net.runelite.api.InstanceTemplates; import net.runelite.api.NullObjectID; import static net.runelite.api.Perspective.SCENE_SIZE; import net.runelite.api.Point; +import static net.runelite.api.SpriteID.TAB_QUESTS_BROWN_RAIDING_PARTY; import net.runelite.api.Tile; import net.runelite.api.VarPlayer; import net.runelite.api.Varbits; @@ -60,6 +58,7 @@ import net.runelite.client.chat.ChatMessageBuilder; import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.chat.QueuedMessage; import net.runelite.client.config.ConfigManager; +import net.runelite.client.game.SpriteManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.raids.solver.Layout; @@ -86,7 +85,6 @@ public class RaidsPlugin extends Plugin private static final String SPLIT_REGEX = "\\s*,\\s*"; private static final Pattern ROTATION_REGEX = Pattern.compile("\\[(.*?)]"); - private BufferedImage raidsIcon; private RaidsTimer timer; @Getter @@ -116,6 +114,9 @@ public class RaidsPlugin extends Plugin @Inject private LayoutSolver layoutSolver; + @Inject + private SpriteManager spriteManager; + @Getter private Raid raid; @@ -270,7 +271,7 @@ public class RaidsPlugin extends Plugin if (config.raidsTimer() && message.startsWith(RAID_START_MESSAGE)) { - timer = new RaidsTimer(getRaidsIcon(), this, Instant.now()); + timer = new RaidsTimer(spriteManager.getSprite(TAB_QUESTS_BROWN_RAIDING_PARTY, 0), this, Instant.now()); infoBoxManager.addInfoBox(timer); } @@ -602,25 +603,4 @@ public class RaidsPlugin extends Plugin return room; } - - private BufferedImage getRaidsIcon() - { - if (raidsIcon != null) - { - return raidsIcon; - } - try - { - synchronized (ImageIO.class) - { - raidsIcon = ImageIO.read(RaidsPlugin.class.getResourceAsStream("raids_icon.png")); - } - } - catch (IOException ex) - { - log.warn("Unable to load image", ex); - } - - return raidsIcon; - } } diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/raids/raids_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/raids/raids_icon.png deleted file mode 100644 index 3a239a5f33a747dd8358110929ad300b5c981ad9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3210 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 From c8ba452c84317b69979d855ab1a2ae8aef039218 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Thu, 19 Jul 2018 13:21:19 -0700 Subject: [PATCH 15/17] screenshot plugin: Use Sprite ID for overlay image --- .../plugins/screenshot/ScreenshotOverlay.java | 34 +++++------------- .../plugins/screenshot/ScreenshotPlugin.java | 22 +++++++++++- .../plugins/screenshot/report_button.png | Bin 1309 -> 0 bytes 3 files changed, 29 insertions(+), 27 deletions(-) delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/screenshot/report_button.png diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotOverlay.java index 69357d5bdb..07248ed58a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotOverlay.java @@ -31,16 +31,13 @@ import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; -import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.function.Consumer; -import javax.imageio.ImageIO; import javax.inject.Inject; -import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.MainBufferProvider; import net.runelite.client.ui.DrawManager; @@ -50,41 +47,26 @@ import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; -@Slf4j public class ScreenshotOverlay extends Overlay { private static final DateFormat DATE_FORMAT = new SimpleDateFormat("MMM. dd, yyyy"); private static final int REPORT_BUTTON_X_OFFSET = 404; - private static BufferedImage REPORT_BUTTON; - - static - { - try - { - synchronized (ImageIO.class) - { - REPORT_BUTTON = ImageIO.read(ScreenshotPlugin.class.getResourceAsStream("report_button.png")); - } - } - catch (IOException e) - { - log.warn("Report button image failed to load", e); - } - } private final Client client; private final DrawManager drawManager; + private final ScreenshotPlugin plugin; private final Queue> consumers = new ConcurrentLinkedQueue<>(); @Inject - public ScreenshotOverlay(Client client, DrawManager drawManager) + public ScreenshotOverlay(Client client, DrawManager drawManager, ScreenshotPlugin plugin) { setPosition(OverlayPosition.DYNAMIC); setPriority(OverlayPriority.HIGH); setLayer(OverlayLayer.ABOVE_WIDGETS); this.client = client; this.drawManager = drawManager; + this.plugin = plugin; } @Override @@ -97,9 +79,9 @@ public class ScreenshotOverlay extends Overlay final MainBufferProvider bufferProvider = (MainBufferProvider) client.getBufferProvider(); final int imageHeight = ((BufferedImage) bufferProvider.getImage()).getHeight(); - final int y = imageHeight - REPORT_BUTTON.getHeight() - 1; + final int y = imageHeight - plugin.getReportButton().getHeight() - 1; - graphics.drawImage(REPORT_BUTTON, REPORT_BUTTON_X_OFFSET, y, null); + graphics.drawImage(plugin.getReportButton(), REPORT_BUTTON_X_OFFSET, y, null); graphics.setFont(FontManager.getRunescapeSmallFont()); FontMetrics fontMetrics = graphics.getFontMetrics(); @@ -108,8 +90,8 @@ public class ScreenshotOverlay extends Overlay final int dateWidth = fontMetrics.stringWidth(date); final int dateHeight = fontMetrics.getHeight(); - final int textX = REPORT_BUTTON_X_OFFSET + REPORT_BUTTON.getWidth() / 2 - dateWidth / 2; - final int textY = y + REPORT_BUTTON.getHeight() / 2 + dateHeight / 2; + final int textX = REPORT_BUTTON_X_OFFSET + plugin.getReportButton().getWidth() / 2 - dateWidth / 2; + final int textY = y + plugin.getReportButton().getHeight() / 2 + dateHeight / 2; graphics.setColor(Color.BLACK); graphics.drawString(date, textX + 1, textY + 1); @@ -130,7 +112,7 @@ public class ScreenshotOverlay extends Overlay public void queueForTimestamp(Consumer screenshotConsumer) { - if (REPORT_BUTTON == null) + if (plugin.getReportButton() == null) { return; } 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 01e4ab47c4..b9e26db8dc 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 @@ -52,13 +52,17 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.imageio.ImageIO; import javax.inject.Inject; +import lombok.AccessLevel; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; import net.runelite.api.ChatMessageType; import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.Point; +import net.runelite.api.SpriteID; import net.runelite.api.WorldType; import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameTick; import net.runelite.api.events.WidgetLoaded; import net.runelite.api.widgets.Widget; @@ -74,6 +78,7 @@ import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.Notifier; import static net.runelite.client.RuneLite.SCREENSHOT_DIR; import net.runelite.client.config.ConfigManager; +import net.runelite.client.game.SpriteManager; import net.runelite.client.input.KeyManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -170,6 +175,12 @@ public class ScreenshotPlugin extends Plugin @Inject private KeyManager keyManager; + @Inject + private SpriteManager spriteManager; + + @Getter(AccessLevel.PACKAGE) + private BufferedImage reportButton; + private NavigationButton titleBarButton; private final HotkeyListener hotkeyListener = new HotkeyListener(() -> config.hotkey()) @@ -218,7 +229,6 @@ public class ScreenshotPlugin extends Plugin catch (IOException ex) { log.warn("Error opening screenshot dir", ex); - } }) .build()) @@ -240,6 +250,16 @@ public class ScreenshotPlugin extends Plugin keyManager.unregisterKeyListener(hotkeyListener); } + @Subscribe + public void onGameStateChanged(GameStateChanged event) + { + if (event.getGameState() == GameState.LOGGED_IN + && reportButton == null) + { + reportButton = spriteManager.getSprite(SpriteID.CHATBOX_REPORT_BUTTON, 0); + } + } + @Subscribe public void onGameTick(GameTick event) { diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/screenshot/report_button.png b/runelite-client/src/main/resources/net/runelite/client/plugins/screenshot/report_button.png deleted file mode 100644 index 34603643c6603f9f5635e278d54f46a65bbaba73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1309 zcmV+&1>*XNP);BC#$&A|xQ-NWjU8j0lMY2{ID?c$k`-H-7!5 zs=LQ)z*4DurmL&E>%FRO+h=F;`EC7a_vhVR_t&e>r&i_f`+K(!v3Vwc+^wg+_pI-2 zuJt{i>L0>BVaM9vKU*jMqQ31nC%@d>bic0ida&i~9c{@^HB67>wETU{96mzlfds@ z#tkr&Z$En8eZ9IG+Hame>t?{2fyV@~2C&?m#{lQ~N5G=BF#r)5Igk)!?H>!OH)a6- z^huilxa;Nq@`ElZm3uMZW!qBVRHtU%DG9SA6Hg__uFE46vL4`B*1fr2bzfdxb~hL2 z-5Dz_3F5IqDe0(v?^)S@Y#BR7Z;7vHekr4I&H*?R1I}c3^>hI5?!Aj{Dw(CsI|bt( z8<1l&Mv1v}4LY`jG_1ohj?PX#2a$2eIxCsmUcPubW}bn8!_hP7olOx_Y5`DoEoHNo zn1|6$WDD=@QgABraJ4F(nR@BL<%H++K7a=UH=K8U)&acRCrRcV4$0b0=4^ZH_&Ew>qOAm2lv&sH*OaY)rZd8_MIqjZ=S7&tg~`yz$KZ7 ztYd>YR_>kaZhGxKjO!*f0GfebX0c8Vur%O}8(1$34&|zK=XoGR>xgXN?9#r;4^5kV zEhqtJx6SFof{FTFM!y3+1R&|cl~Fl)2yF2=Rk9HUX$b(F5wM}QasaR$y=>%!!2)0q zyIBG_7d-wl$X`@bmbTeaWvQ-!<>tWGJY(8$4N)*^gX9IecHS}eb3l2Zai-b%X25;5 zTDibY;MFop8JH^_U@_X&p+P z)?@&We>cl9=NPutvXNQIwVy?U0M?d*TeFrN5G9H9d7TWBT|%~FmT{&jaGYfTZkBll z9)hrB(Ye4O*rl6JKcm25lO4}^iTmI3t2 zq*pGHaR71xF9$}F;@3eS$6yZQ*9UzL;55fJ!~hTrm5F%9mDvjhY-!*)W7%Jl2|^Cu z&kT&wXQG1`0I0FgS9}I%(~ob)pSMhM*~Wl{XP$k`hyth^VCHCWy9XKwsk#`o?`V6BiV?0 TdRyN>00000NkvXXu0mjfU?PFu From 37092ce42384b5e79f575a88373f567a30a561aa Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Wed, 18 Jul 2018 11:02:53 -0700 Subject: [PATCH 16/17] xp tracker plugin: Use shared image for icon --- .../plugins/xptracker/XpTrackerPlugin.java | 2 +- .../net/runelite/client/plugins/xptracker/xp.png | Bin 1376 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/xptracker/xp.png 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 4eb005b5ac..32dee4a246 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 @@ -105,7 +105,7 @@ public class XpTrackerPlugin extends Plugin BufferedImage icon; synchronized (ImageIO.class) { - icon = ImageIO.read(getClass().getResourceAsStream("xp.png")); + icon = ImageIO.read(getClass().getResourceAsStream("/skill_icons/overall.png")); } navButton = NavigationButton.builder() diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/xptracker/xp.png b/runelite-client/src/main/resources/net/runelite/client/plugins/xptracker/xp.png deleted file mode 100644 index 90914d8f57b0d6d9733f7a2dd6261a542971e6f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1376 zcmeAS@N?(olHy`uVBq!ia0vp^fSyM zs%4dBL8dS=LDT@*$|_3r{S8ysPIs^K5mgWciU8$>1qI*=q*SFNr^Uz2O|q|c6;lv{ zDB$7*c@_dBRU|{EL^;4@nVFf{IXO)vB`u|;%_Sw}lq3Ttgc}!I3CRhA)H5=<%F8ct zaM>$L!#=yqHAQ_>+C(a`-Z6&83C8r*#suL|GV;~VIC#7PlXWe7$vc%M(PE1@`O~*?_ zR8B_9kY7NYm5~i-^7J(`TNkwFE-Y%8+Y~-0K5cGx#pH_M=~0Q(QVY5ZT$;T@+aohu zGxvFVuC=x?R*`Y6^>A(W4(bXIZ;!DNmpI_%wI7UDn3?M{mBzX9w`1sX;>2r$5 z(`UfYFDMD}3uagkWHE^C{{R0+B*Q&m?hsxFRPp~5%TYN7<`qEJX_gH@1uSR5%x!G! z-26c1X_hCM8}8oz4q{#22hspyfk`HidH;_q`FME=|9^4-C*qKhMAC&He!u zFeZ7syS!1{xmg;>VK4FYb!C6Z!^p#=)g!*^GEiE|)5S4F;&O6AN>W-vVrug92TvY7 zOJrb-v#VocbW}_f3^Xj{+|aRPib-?NnmIL&3!4@RMYu$|hWf@j2d`cc5$!InvuJsK zLPknXP*7A_RvMq!#tmCGZQHn2d;N+nsQiJ zvuFKfW@>J7c9M*Wx_!&qYWJ?{s>6qrl@>2bmiYBc-Di$T<*6%~my;hq5*C^~Niyxs z9MkG^cPc-N>-c#3ddE+hcydF<$xErH!`H-YtvY+F^tE};oh_0on^IqIduv_x?$+M) z_xt{`^EJ8f$=Vftx$#k0-G8oKv6=Slhj)H*i|fbkEBbottF(Fk-F=fMpDy@*?=L&Q zylvg5FE>An>&Ndscbc8y$L9j=87@nJg%X2miEBhjN@7W>RdP`(kYX@0Ff`XSG}1M+ z2r)FZGBmU@vCuX!v@$S=-h46~MMG|WN@iLmT!VpO2vD_wk(G%NM1!64Q&5q~;OXk; Jvd$@?2>_qJtLy*( From 5c219c7ea516b58cd8e5ba3685cbbae5f2797010 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Wed, 1 Aug 2018 16:29:16 -0700 Subject: [PATCH 17/17] 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. *