Merge pull request #9275 from abextm/empty-cache-firsttime

runelite-client: Handle startup with an empty cache better
This commit is contained in:
Adam
2019-07-15 11:09:15 -04:00
committed by GitHub
19 changed files with 106 additions and 88 deletions

View File

@@ -360,6 +360,7 @@ public interface Client extends GameEngine
* @param scale the scale of the sprite * @param scale the scale of the sprite
* @return the created sprite * @return the created sprite
*/ */
@Nullable
SpritePixels createItemSprite(int itemId, int quantity, int border, int shadowColor, int stackable, boolean noted, int scale); SpritePixels createItemSprite(int itemId, int quantity, int border, int shadowColor, int stackable, boolean noted, int scale);
/** /**
@@ -370,6 +371,7 @@ public interface Client extends GameEngine
* @param fileId the sprites file ID * @param fileId the sprites file ID
* @return the sprite image of the file * @return the sprite image of the file
*/ */
@Nullable
SpritePixels[] getSprites(IndexDataBase source, int archiveId, int fileId); SpritePixels[] getSprites(IndexDataBase source, int archiveId, int fileId);
/** /**

View File

@@ -58,7 +58,7 @@ public class ClientThread
{ {
if (client.isClientThread()) if (client.isClientThread())
{ {
if (r.getAsBoolean()) if (!r.getAsBoolean())
{ {
invokes.add(r); invokes.add(r);
} }

View File

@@ -41,6 +41,8 @@ import net.runelite.api.Client;
import net.runelite.api.GameState; import net.runelite.api.GameState;
import net.runelite.api.SpritePixels; import net.runelite.api.SpritePixels;
import net.runelite.client.callback.ClientThread; import net.runelite.client.callback.ClientThread;
import net.runelite.client.ui.overlay.infobox.InfoBox;
import net.runelite.client.ui.overlay.infobox.InfoBoxManager;
import net.runelite.client.util.ImageUtil; import net.runelite.client.util.ImageUtil;
@Singleton @Singleton
@@ -52,6 +54,9 @@ public class SpriteManager
@Inject @Inject
private ClientThread clientThread; private ClientThread clientThread;
@Inject
private InfoBoxManager infoBoxManager;
public Cache<Long, BufferedImage> cache = CacheBuilder.newBuilder() public Cache<Long, BufferedImage> cache = CacheBuilder.newBuilder()
.maximumSize(128L) .maximumSize(128L)
.expireAfterAccess(1, TimeUnit.HOURS) .expireAfterAccess(1, TimeUnit.HOURS)
@@ -74,6 +79,11 @@ public class SpriteManager
} }
SpritePixels[] sp = client.getSprites(client.getIndexSprites(), archive, 0); SpritePixels[] sp = client.getSprites(client.getIndexSprites(), archive, 0);
if (sp == null)
{
return null;
}
BufferedImage img = sp[file].toBufferedImage(); BufferedImage img = sp[file].toBufferedImage();
cache.put(key, img); cache.put(key, img);
@@ -102,6 +112,15 @@ public class SpriteManager
}); });
} }
public void getSpriteAsync(int archive, int file, InfoBox infoBox)
{
getSpriteAsync(archive, file, img ->
{
infoBox.setImage(img);
infoBoxManager.updateInfoBoxImage(infoBox);
});
}
/** /**
* Calls setIcon on c, ensuring it is repainted when this changes * Calls setIcon on c, ensuring it is repainted when this changes
*/ */

View File

@@ -322,10 +322,12 @@ public class BarrowsPlugin extends Plugin
final LoopTimer loopTimer = new LoopTimer( final LoopTimer loopTimer = new LoopTimer(
PRAYER_DRAIN_INTERVAL_MS, PRAYER_DRAIN_INTERVAL_MS,
ChronoUnit.MILLIS, ChronoUnit.MILLIS,
spriteManager.getSprite(SpriteID.TAB_PRAYER, 0), null,
this, this,
true); true);
spriteManager.getSpriteAsync(SpriteID.TAB_PRAYER, 0, loopTimer);
loopTimer.setPriority(InfoBoxPriority.MED); loopTimer.setPriority(InfoBoxPriority.MED);
loopTimer.setTooltip("Prayer Drain"); loopTimer.setTooltip("Prayer Drain");

View File

@@ -25,7 +25,7 @@
package net.runelite.client.plugins.cooking; package net.runelite.client.plugins.cooking;
import java.awt.Color; import java.awt.Color;
import java.awt.Image; import java.awt.image.BufferedImage;
import java.time.Duration; import java.time.Duration;
import java.time.Instant; import java.time.Instant;
import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.Plugin;
@@ -37,7 +37,7 @@ final class FermentTimer extends InfoBox
private Instant fermentTime; private Instant fermentTime;
FermentTimer(Image image, Plugin plugin) FermentTimer(BufferedImage image, Plugin plugin)
{ {
super(image, plugin); super(image, plugin);
reset(); reset();

View File

@@ -29,6 +29,7 @@ import java.awt.Dimension;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.Rectangle; import java.awt.Rectangle;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import javax.annotation.Nullable;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import lombok.Getter; import lombok.Getter;
@@ -87,8 +88,10 @@ class InstanceMapOverlay extends Overlay
@Setter @Setter
private boolean isCloseButtonHovered; private boolean isCloseButtonHovered;
@Getter @Getter
private Rectangle closeButtonBounds; private Rectangle closeButtonBounds;
private BufferedImage closeButtonImage; private BufferedImage closeButtonImage;
private BufferedImage closeButtonHoveredImage; private BufferedImage closeButtonHoveredImage;
@@ -166,8 +169,6 @@ class InstanceMapOverlay extends Overlay
if (image == null) if (image == null)
{ {
BufferedImage closeButton = getCloseButtonImage();
SpritePixels map = client.drawInstanceMap(viewedPlane); SpritePixels map = client.drawInstanceMap(viewedPlane);
image = minimapToBufferedImage(map); image = minimapToBufferedImage(map);
synchronized (this) synchronized (this)
@@ -177,7 +178,12 @@ class InstanceMapOverlay extends Overlay
mapImage = image; mapImage = image;
} }
} }
}
BufferedImage closeButton = getCloseButtonImage();
BufferedImage closeButtonHover = getCloseButtonHoveredImage();
if (closeButton != null && closeButtonBounds == null)
{
closeButtonBounds = new Rectangle(image.getWidth() - closeButton.getWidth() - 5, 6, closeButtonBounds = new Rectangle(image.getWidth() - closeButton.getWidth() - 5, 6,
closeButton.getWidth(), closeButton.getHeight()); closeButton.getWidth(), closeButton.getHeight());
} }
@@ -191,8 +197,15 @@ class InstanceMapOverlay extends Overlay
drawPlayerDot(graphics, client.getLocalPlayer(), Color.white, Color.black); drawPlayerDot(graphics, client.getLocalPlayer(), Color.white, Color.black);
} }
graphics.drawImage(isCloseButtonHovered ? getCloseButtonHoveredImage() : getCloseButtonImage(), if (isCloseButtonHovered)
(int) closeButtonBounds.getX(), (int) closeButtonBounds.getY(), null); {
closeButton = closeButtonHover;
}
if (closeButton != null)
{
graphics.drawImage(closeButton, (int) closeButtonBounds.getX(), (int) closeButtonBounds.getY(), null);
}
return new Dimension(image.getWidth(), image.getHeight()); return new Dimension(image.getWidth(), image.getHeight());
} }
@@ -252,6 +265,7 @@ class InstanceMapOverlay extends Overlay
return img; return img;
} }
@Nullable
private BufferedImage getCloseButtonImage() private BufferedImage getCloseButtonImage()
{ {
if (closeButtonImage == null) if (closeButtonImage == null)
@@ -261,6 +275,7 @@ class InstanceMapOverlay extends Overlay
return closeButtonImage; return closeButtonImage;
} }
@Nullable
private BufferedImage getCloseButtonHoveredImage() private BufferedImage getCloseButtonHoveredImage()
{ {
if (closeButtonHoveredImage == null) if (closeButtonHoveredImage == null)

View File

@@ -299,6 +299,11 @@ public class PuzzleSolverOverlay extends Overlay
arrow = getUpArrow(); arrow = getUpArrow();
} }
if (arrow == null)
{
continue;
}
int x = puzzleBoxLocation.getX() + blankX * PUZZLE_TILE_SIZE int x = puzzleBoxLocation.getX() + blankX * PUZZLE_TILE_SIZE
+ PUZZLE_TILE_SIZE / 2 - arrow.getWidth() / 2; + PUZZLE_TILE_SIZE / 2 - arrow.getWidth() / 2;

View File

@@ -193,7 +193,8 @@ public class RaidsPlugin extends Plugin
if (config.raidsTimer() && message.startsWith(RAID_START_MESSAGE)) if (config.raidsTimer() && message.startsWith(RAID_START_MESSAGE))
{ {
timer = new RaidsTimer(spriteManager.getSprite(TAB_QUESTS_BROWN_RAIDING_PARTY, 0), this, Instant.now()); timer = new RaidsTimer(this, Instant.now());
spriteManager.getSpriteAsync(TAB_QUESTS_BROWN_RAIDING_PARTY, 0, timer);
infoBoxManager.addInfoBox(timer); infoBoxManager.addInfoBox(timer);
} }

View File

@@ -25,7 +25,6 @@
package net.runelite.client.plugins.raids; package net.runelite.client.plugins.raids;
import java.awt.Color; import java.awt.Color;
import java.awt.image.BufferedImage;
import java.time.Duration; import java.time.Duration;
import java.time.Instant; import java.time.Instant;
import java.time.LocalTime; import java.time.LocalTime;
@@ -47,9 +46,9 @@ public class RaidsTimer extends InfoBox
@Setter @Setter
private boolean stopped; private boolean stopped;
public RaidsTimer(BufferedImage image, Plugin plugin, Instant startTime) public RaidsTimer(Plugin plugin, Instant startTime)
{ {
super(image, plugin); super(null, plugin);
this.startTime = startTime; this.startTime = startTime;
floorTime = startTime; floorTime = startTime;
stopped = false; stopped = false;

View File

@@ -64,7 +64,6 @@ import net.runelite.api.Point;
import net.runelite.api.SpriteID; import net.runelite.api.SpriteID;
import net.runelite.api.WorldType; import net.runelite.api.WorldType;
import net.runelite.api.events.ChatMessage; import net.runelite.api.events.ChatMessage;
import net.runelite.api.events.GameStateChanged;
import net.runelite.api.events.GameTick; import net.runelite.api.events.GameTick;
import net.runelite.api.events.LocalPlayerDeath; import net.runelite.api.events.LocalPlayerDeath;
import net.runelite.api.events.WidgetLoaded; import net.runelite.api.events.WidgetLoaded;
@@ -235,6 +234,8 @@ public class ScreenshotPlugin extends Plugin
.build(); .build();
clientToolbar.addNavigation(titleBarButton); clientToolbar.addNavigation(titleBarButton);
spriteManager.getSpriteAsync(SpriteID.CHATBOX_REPORT_BUTTON, 0, s -> reportButton = s);
} }
@Override @Override
@@ -245,16 +246,6 @@ public class ScreenshotPlugin extends Plugin
keyManager.unregisterKeyListener(hotkeyListener); 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 @Subscribe
public void onGameTick(GameTick event) public void onGameTick(GameTick event)
{ {

View File

@@ -27,7 +27,7 @@ package net.runelite.client.plugins.statusbars;
import java.awt.Color; import java.awt.Color;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.Image; import java.awt.image.BufferedImage;
import javax.inject.Inject; import javax.inject.Inject;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.MenuEntry; import net.runelite.api.MenuEntry;
@@ -83,7 +83,7 @@ class StatusBarsOverlay extends Overlay
private final TextComponent textComponent = new TextComponent(); private final TextComponent textComponent = new TextComponent();
private final ItemStatChangesService itemStatService; private final ItemStatChangesService itemStatService;
private final Image prayerImage; private final BufferedImage prayerImage;
@Inject @Inject
private StatusBarsOverlay(Client client, StatusBarsConfig config, SkillIconManager skillIconManager, ItemStatChangesService itemstatservice) private StatusBarsOverlay(Client client, StatusBarsConfig config, SkillIconManager skillIconManager, ItemStatChangesService itemstatservice)
@@ -225,7 +225,7 @@ class StatusBarsOverlay extends Overlay
if (config.enableSkillIcon() || config.enableCounter()) if (config.enableSkillIcon() || config.enableCounter())
{ {
final Image healthImage = skillIconManager.getSkillImage(Skill.HITPOINTS, true); final BufferedImage healthImage = skillIconManager.getSkillImage(Skill.HITPOINTS, true);
final int counterHealth = client.getBoostedSkillLevel(Skill.HITPOINTS); final int counterHealth = client.getBoostedSkillLevel(Skill.HITPOINTS);
final int counterPrayer = client.getBoostedSkillLevel(Skill.PRAYER); final int counterPrayer = client.getBoostedSkillLevel(Skill.PRAYER);
final String counterHealthText = Integer.toString(counterHealth); final String counterHealthText = Integer.toString(counterHealth);
@@ -294,7 +294,7 @@ class StatusBarsOverlay extends Overlay
return (int) Math.round(ratio * size); return (int) Math.round(ratio * size);
} }
private void renderIconsAndCounters(Graphics2D graphics, int x, int y, Image image, String counterText, int counterPadding) private void renderIconsAndCounters(Graphics2D graphics, int x, int y, BufferedImage image, String counterText, int counterPadding)
{ {
final int widthOfCounter = graphics.getFontMetrics().stringWidth(counterText); final int widthOfCounter = graphics.getFontMetrics().stringWidth(counterText);
final int centerText = (WIDTH - PADDING) / 2 - (widthOfCounter / 2); final int centerText = (WIDTH - PADDING) / 2 - (widthOfCounter / 2);

View File

@@ -25,22 +25,17 @@
package net.runelite.client.plugins.timers; package net.runelite.client.plugins.timers;
import java.awt.Color; import java.awt.Color;
import java.awt.image.BufferedImage;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.Getter; import lombok.Getter;
import net.runelite.api.SpriteID; import net.runelite.api.SpriteID;
import net.runelite.client.game.ItemManager;
import net.runelite.client.game.SpriteManager;
@Getter(AccessLevel.PACKAGE)
enum GameIndicator enum GameIndicator
{ {
VENGEANCE_ACTIVE(SpriteID.SPELL_VENGEANCE_OTHER, GameTimerImageType.SPRITE, "Vengeance active"); VENGEANCE_ACTIVE(SpriteID.SPELL_VENGEANCE_OTHER, GameTimerImageType.SPRITE, "Vengeance active");
@Getter(AccessLevel.PACKAGE)
private final String description; private final String description;
@Getter(AccessLevel.PACKAGE)
private String text; private String text;
@Getter(AccessLevel.PACKAGE)
private Color textColor; private Color textColor;
private final int imageId; private final int imageId;
private final GameTimerImageType imageType; private final GameTimerImageType imageType;
@@ -58,17 +53,4 @@ enum GameIndicator
{ {
this(imageId, idType, description, "", null); this(imageId, idType, description, "", null);
} }
BufferedImage getImage(ItemManager itemManager, SpriteManager spriteManager)
{
switch (imageType)
{
case ITEM:
return itemManager.getImage(imageId);
case SPRITE:
return spriteManager.getSprite(imageId, 0);
default:
return null;
}
}
} }

View File

@@ -26,16 +26,15 @@
*/ */
package net.runelite.client.plugins.timers; package net.runelite.client.plugins.timers;
import java.awt.image.BufferedImage;
import java.time.Duration; import java.time.Duration;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import lombok.AccessLevel;
import lombok.Getter; import lombok.Getter;
import net.runelite.api.GraphicID; import net.runelite.api.GraphicID;
import net.runelite.api.ItemID; import net.runelite.api.ItemID;
import net.runelite.api.SpriteID; import net.runelite.api.SpriteID;
import net.runelite.client.game.ItemManager;
import net.runelite.client.game.SpriteManager;
@Getter(AccessLevel.PACKAGE)
enum GameTimer enum GameTimer
{ {
STAMINA(ItemID.STAMINA_POTION4, GameTimerImageType.ITEM, "Stamina", 2, ChronoUnit.MINUTES, true), STAMINA(ItemID.STAMINA_POTION4, GameTimerImageType.ITEM, "Stamina", 2, ChronoUnit.MINUTES, true),
@@ -81,15 +80,10 @@ enum GameTimer
MINIGAME_TELEPORT(SpriteID.TAB_QUESTS_RED_MINIGAMES, GameTimerImageType.SPRITE, "Minigame Teleport", 20, ChronoUnit.MINUTES), MINIGAME_TELEPORT(SpriteID.TAB_QUESTS_RED_MINIGAMES, GameTimerImageType.SPRITE, "Minigame Teleport", 20, ChronoUnit.MINUTES),
DRAGON_FIRE_SHIELD(ItemID.DRAGONFIRE_SHIELD_11284, GameTimerImageType.ITEM, "Dragonfire Shield Special", 2, ChronoUnit.MINUTES); DRAGON_FIRE_SHIELD(ItemID.DRAGONFIRE_SHIELD_11284, GameTimerImageType.ITEM, "Dragonfire Shield Special", 2, ChronoUnit.MINUTES);
@Getter
private final Duration duration; private final Duration duration;
@Getter
private final Integer graphicId; private final Integer graphicId;
@Getter
private final String description; private final String description;
@Getter
private final boolean removedOnDeath; private final boolean removedOnDeath;
@Getter
private final Duration initialDelay; private final Duration initialDelay;
private final int imageId; private final int imageId;
private final GameTimerImageType imageType; private final GameTimerImageType imageType;
@@ -129,17 +123,4 @@ enum GameTimer
{ {
this(imageId, idType, description, null, time, unit, delay, false); this(imageId, idType, description, null, time, unit, delay, false);
} }
BufferedImage getImage(ItemManager itemManager, SpriteManager spriteManager)
{
switch (imageType)
{
case ITEM:
return itemManager.getImage(imageId);
case SPRITE:
return spriteManager.getSprite(imageId, 0);
default:
return null;
}
}
} }

View File

@@ -25,7 +25,6 @@
package net.runelite.client.plugins.timers; package net.runelite.client.plugins.timers;
import java.awt.Color; import java.awt.Color;
import java.awt.Image;
import lombok.Getter; import lombok.Getter;
import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.Plugin;
import net.runelite.client.ui.overlay.infobox.InfoBox; import net.runelite.client.ui.overlay.infobox.InfoBox;
@@ -36,9 +35,9 @@ public class IndicatorIndicator extends InfoBox
@Getter @Getter
private final GameIndicator indicator; private final GameIndicator indicator;
IndicatorIndicator(GameIndicator indicator, Image image, Plugin plugin) IndicatorIndicator(GameIndicator indicator, Plugin plugin)
{ {
super(image, plugin); super(null, plugin);
this.indicator = indicator; this.indicator = indicator;
setPriority(InfoBoxPriority.MED); setPriority(InfoBoxPriority.MED);
} }

View File

@@ -24,7 +24,6 @@
*/ */
package net.runelite.client.plugins.timers; package net.runelite.client.plugins.timers;
import java.awt.image.BufferedImage;
import java.time.Duration; import java.time.Duration;
import java.time.Instant; import java.time.Instant;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
@@ -36,9 +35,9 @@ class TimerTimer extends Timer
{ {
private final GameTimer timer; private final GameTimer timer;
TimerTimer(GameTimer timer, Plugin plugin, BufferedImage image) TimerTimer(GameTimer timer, Plugin plugin)
{ {
super(timer.getDuration().toMillis(), ChronoUnit.MILLIS, image, plugin); super(timer.getDuration().toMillis(), ChronoUnit.MILLIS, null, plugin);
this.timer = timer; this.timer = timer;
setPriority(InfoBoxPriority.MED); setPriority(InfoBoxPriority.MED);
} }

View File

@@ -26,7 +26,6 @@
package net.runelite.client.plugins.timers; package net.runelite.client.plugins.timers;
import com.google.inject.Provides; import com.google.inject.Provides;
import java.awt.image.BufferedImage;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javax.inject.Inject; import javax.inject.Inject;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -866,8 +865,16 @@ public class TimersPlugin extends Plugin
{ {
removeGameTimer(timer); removeGameTimer(timer);
BufferedImage image = timer.getImage(itemManager, spriteManager); TimerTimer t = new TimerTimer(timer, this);
TimerTimer t = new TimerTimer(timer, this, image); switch (timer.getImageType())
{
case SPRITE:
spriteManager.getSpriteAsync(timer.getImageId(), 0, t);
break;
case ITEM:
t.setImage(itemManager.getImage(timer.getImageId()));
break;
}
t.setTooltip(timer.getDescription()); t.setTooltip(timer.getDescription());
infoBoxManager.addInfoBox(t); infoBoxManager.addInfoBox(t);
return t; return t;
@@ -882,8 +889,16 @@ public class TimersPlugin extends Plugin
{ {
removeGameIndicator(gameIndicator); removeGameIndicator(gameIndicator);
BufferedImage image = gameIndicator.getImage(itemManager, spriteManager); IndicatorIndicator indicator = new IndicatorIndicator(gameIndicator, this);
IndicatorIndicator indicator = new IndicatorIndicator(gameIndicator, image, this); switch (gameIndicator.getImageType())
{
case SPRITE:
spriteManager.getSpriteAsync(gameIndicator.getImageId(), 0, indicator);
break;
case ITEM:
indicator.setImage(itemManager.getImage(gameIndicator.getImageId()));
break;
}
indicator.setTooltip(gameIndicator.getDescription()); indicator.setTooltip(gameIndicator.getDescription());
infoBoxManager.addInfoBox(indicator); infoBoxManager.addInfoBox(indicator);

View File

@@ -29,9 +29,9 @@ import java.awt.Color;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.FontMetrics; import java.awt.FontMetrics;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point; import java.awt.Point;
import java.awt.Rectangle; import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import net.runelite.client.ui.FontManager; import net.runelite.client.ui.FontManager;
@@ -53,7 +53,7 @@ public class InfoBoxComponent implements LayoutableRenderableEntity
private String text; private String text;
private Color color = Color.WHITE; private Color color = Color.WHITE;
private Color backgroundColor = ComponentConstants.STANDARD_BACKGROUND_COLOR; private Color backgroundColor = ComponentConstants.STANDARD_BACKGROUND_COLOR;
private Image image; private BufferedImage image;
@Override @Override
public Dimension render(Graphics2D graphics) public Dimension render(Graphics2D graphics)

View File

@@ -25,7 +25,7 @@
package net.runelite.client.ui.overlay.infobox; package net.runelite.client.ui.overlay.infobox;
import java.awt.Color; import java.awt.Color;
import java.awt.Image; import java.awt.image.BufferedImage;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@@ -38,11 +38,11 @@ public abstract class InfoBox
@Getter @Getter
@Setter @Setter
private Image image; private BufferedImage image;
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
@Setter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE)
private Image scaledImage; private BufferedImage scaledImage;
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
@Setter @Setter
@@ -52,7 +52,7 @@ public abstract class InfoBox
@Setter @Setter
private String tooltip; private String tooltip;
public InfoBox(Image image, Plugin plugin) public InfoBox(BufferedImage image, Plugin plugin)
{ {
this.plugin = plugin; this.plugin = plugin;
setImage(image); setImage(image);

View File

@@ -27,7 +27,6 @@ package net.runelite.client.ui.overlay.infobox;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import com.google.common.collect.ComparisonChain; import com.google.common.collect.ComparisonChain;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@@ -40,6 +39,7 @@ import lombok.extern.slf4j.Slf4j;
import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.ConfigChanged;
import net.runelite.client.config.RuneLiteConfig; import net.runelite.client.config.RuneLiteConfig;
import net.runelite.client.eventbus.Subscribe; import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.game.AsyncBufferedImage;
import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginDescriptor;
@Singleton @Singleton
@@ -72,6 +72,14 @@ public class InfoBoxManager
updateInfoBoxImage(infoBox); updateInfoBoxImage(infoBox);
infoBoxes.add(infoBox); infoBoxes.add(infoBox);
refreshInfoBoxes(); refreshInfoBoxes();
BufferedImage image = infoBox.getImage();
if (image instanceof AsyncBufferedImage)
{
AsyncBufferedImage abi = (AsyncBufferedImage) image;
abi.onChanged(() -> updateInfoBoxImage(infoBox));
}
} }
public void removeInfoBox(InfoBox infoBox) public void removeInfoBox(InfoBox infoBox)
@@ -118,7 +126,7 @@ public class InfoBoxManager
} }
} }
private void updateInfoBoxImage(final InfoBox infoBox) public void updateInfoBoxImage(final InfoBox infoBox)
{ {
if (infoBox.getImage() == null) if (infoBox.getImage() == null)
{ {
@@ -126,8 +134,8 @@ public class InfoBoxManager
} }
// Set scaled InfoBox image // Set scaled InfoBox image
final Image image = infoBox.getImage(); final BufferedImage image = infoBox.getImage();
Image resultImage = image; BufferedImage resultImage = image;
final double width = image.getWidth(null); final double width = image.getWidth(null);
final double height = image.getHeight(null); final double height = image.getHeight(null);
final double size = Math.max(2, runeLiteConfig.infoBoxSize()); // Limit size to 2 as that is minimum size not causing breakage final double size = Math.max(2, runeLiteConfig.infoBoxSize()); // Limit size to 2 as that is minimum size not causing breakage