diff --git a/runelite-client/src/main/java/net/runelite/client/RSStub.java b/runelite-client/src/main/java/net/runelite/client/RSStub.java index 9d19de5d37..429c0347fc 100644 --- a/runelite-client/src/main/java/net/runelite/client/RSStub.java +++ b/runelite-client/src/main/java/net/runelite/client/RSStub.java @@ -28,7 +28,6 @@ package net.runelite.client; import java.applet.Applet; import java.applet.AppletContext; import java.applet.AppletStub; -import java.awt.Dimension; import java.net.MalformedURLException; import java.net.URL; @@ -83,10 +82,7 @@ public class RSStub implements AppletStub @Override public void appletResize(int width, int height) { - Dimension d = new Dimension(width, height); - app.setSize(d); - app.setPreferredSize(d); } } diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java index 07ca5a9bd9..2f08e48c4a 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -80,6 +80,10 @@ public class RuneLite public static void main(String[] args) throws Exception { + // Do not fill in background on repaint. Reduces flickering when + // the applet is resized. + System.setProperty("sun.awt.noerasebackground", "true"); + OptionParser parser = new OptionParser(); parser.accepts("developer-mode"); options = parser.parse(args); diff --git a/runelite-client/src/main/java/net/runelite/client/ui/ClientPanel.java b/runelite-client/src/main/java/net/runelite/client/ui/ClientPanel.java index 1c080e4806..160cea9a5c 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/ClientPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/ClientPanel.java @@ -27,8 +27,7 @@ package net.runelite.client.ui; import java.applet.Applet; import java.awt.Color; import java.awt.Dimension; -import java.awt.event.ComponentEvent; -import java.awt.event.ComponentListener; +import java.awt.BorderLayout; import javax.swing.JPanel; import net.runelite.api.Client; import net.runelite.client.ClientLoader; @@ -36,7 +35,7 @@ import net.runelite.client.RuneLite; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class ClientPanel extends JPanel implements ComponentListener +final class ClientPanel extends JPanel { private static final Logger logger = LoggerFactory.getLogger(ClientPanel.class); @@ -49,16 +48,16 @@ final class ClientPanel extends JPanel implements ComponentListener setSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); setMinimumSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); setPreferredSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); + setLayout(new BorderLayout()); setBackground(Color.black); - this.addComponentListener(this); ClientLoader loader = new ClientLoader(); rs = loader.load(); - rs.setSize(this.getSize()); + rs.setLayout(null); rs.init(); rs.start(); - this.add(rs); + add(rs, BorderLayout.CENTER); Client client = null; try @@ -74,30 +73,4 @@ final class ClientPanel extends JPanel implements ComponentListener RuneLite.setClient(client); } - @Override - public void componentResized(ComponentEvent e) - { - if (rs != null) - { - rs.setLocation(0, 0); - rs.setSize(this.getSize()); - rs.setPreferredSize(this.getPreferredSize()); - } - this.setPreferredSize(this.getSize()); - } - - @Override - public void componentMoved(ComponentEvent e) - { - } - - @Override - public void componentShown(ComponentEvent e) - { - } - - @Override - public void componentHidden(ComponentEvent e) - { - } } diff --git a/runelite-client/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java b/runelite-client/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java index 7a334a4a83..e7adee29b5 100644 --- a/runelite-client/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java +++ b/runelite-client/src/main/java/net/runelite/inject/callbacks/RSCanvasCallback.java @@ -26,6 +26,8 @@ package net.runelite.inject.callbacks; import java.awt.Canvas; import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Image; import java.awt.image.BufferedImage; import net.runelite.client.RuneLite; import net.runelite.client.ui.overlay.OverlayRenderer; @@ -45,8 +47,8 @@ public class RSCanvasCallback { if (canvas.getHeight() != clientBuffer.getHeight() || canvas.getWidth() != clientBuffer.getWidth()) { - clientBuffer = new BufferedImage(canvas.getWidth(), canvas.getHeight(), BufferedImage.TYPE_INT_RGB); - gameBuffer = new BufferedImage(canvas.getWidth(), canvas.getHeight(), BufferedImage.TYPE_INT_RGB); + clientBuffer = resize(clientBuffer, canvas.getWidth(), canvas.getHeight()); + gameBuffer = resize(gameBuffer, canvas.getWidth(), canvas.getHeight()); } Graphics clientGraphics = clientBuffer.getGraphics(); @@ -74,4 +76,16 @@ public class RSCanvasCallback return gameBuffer.getGraphics(); } + + private static BufferedImage resize(BufferedImage img, int newWidth, int newHeight) + { + Image tmp = img.getScaledInstance(newWidth, newHeight, Image.SCALE_FAST); + BufferedImage bufferedImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB); + + Graphics2D graphics = bufferedImage.createGraphics(); + graphics.drawImage(tmp, 0, 0, null); + graphics.dispose(); + + return bufferedImage; + } }