diff --git a/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java b/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java index 80ca50edf9..ebb041d5cc 100644 --- a/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java +++ b/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java @@ -283,6 +283,7 @@ public class Hooks implements Callbacks } Image image = mainBufferProvider.getImage(); + final Image finalImage; final Graphics2D graphics2d = (Graphics2D) image.getGraphics(); try @@ -334,13 +335,17 @@ public class Hooks implements Callbacks : RenderingHints.VALUE_INTERPOLATION_BILINEAR); stretchedGraphics.drawImage(image, 0, 0, stretchedDimensions.width, stretchedDimensions.height, null); - image = stretchedImage; + finalImage = image = stretchedImage; + } + else + { + finalImage = image; } // Draw the image onto the game canvas graphics.drawImage(image, 0, 0, client.getCanvas()); - drawManager.processDrawComplete(image); + drawManager.processDrawComplete(() -> finalImage); } @Override diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsDrawListener.java b/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsDrawListener.java index 8c9957f739..3be17f5577 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsDrawListener.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fps/FpsDrawListener.java @@ -24,8 +24,6 @@ */ package net.runelite.client.plugins.fps; -import java.awt.Image; -import java.util.function.Consumer; import javax.inject.Inject; import net.runelite.api.events.FocusChanged; @@ -42,7 +40,7 @@ import net.runelite.api.events.FocusChanged; * Enforcing FPS in the draw code does not impact the client engine's ability to run including its audio, * even when forced to 1 FPS with this plugin. */ -public class FpsDrawListener implements Consumer +public class FpsDrawListener implements Runnable { private static final int SAMPLE_SIZE = 4; @@ -90,7 +88,7 @@ public class FpsDrawListener implements Consumer } @Override - public void accept(Image image) + public void run() { if (!isEnforced()) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/DrawManager.java b/runelite-client/src/main/java/net/runelite/client/ui/DrawManager.java index fc31d90696..1b9ff057c4 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/DrawManager.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/DrawManager.java @@ -30,6 +30,7 @@ import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Consumer; +import java.util.function.Supplier; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; @@ -37,10 +38,10 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public class DrawManager { - private final List> everyFrame = new CopyOnWriteArrayList<>(); + private final List everyFrame = new CopyOnWriteArrayList<>(); private final Queue> nextFrame = new ConcurrentLinkedQueue<>(); - public void registerEveryFrameListener(Consumer everyFrameListener) + public void registerEveryFrameListener(Runnable everyFrameListener) { if (!everyFrame.contains(everyFrameListener)) { @@ -48,7 +49,7 @@ public class DrawManager } } - public void unregisterEveryFrameListener(Consumer everyFrameListener) + public void unregisterEveryFrameListener(Runnable everyFrameListener) { everyFrame.remove(everyFrameListener); } @@ -58,13 +59,13 @@ public class DrawManager nextFrame.add(nextFrameListener); } - public void processDrawComplete(Image image) + public void processDrawComplete(Supplier imageSupplier) { - for (Consumer everyFrameListener : everyFrame) + for (Runnable everyFrameListener : everyFrame) { try { - everyFrameListener.accept(image); + everyFrameListener.run(); } catch (Exception e) { @@ -73,8 +74,27 @@ public class DrawManager } Consumer nextFrameListener = nextFrame.poll(); + Image image = null; while (nextFrameListener != null) { + if (image == null) + { + try + { + image = imageSupplier.get(); + } + catch (Exception ex) + { + log.warn("error getting screenshot", ex); + } + } + + if (image == null) + { + nextFrame.clear(); + break; + } + try { nextFrameListener.accept(image);