From 4265a1cf15e72608ac678b3ce1ffc12a7242b2c5 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 1 Apr 2018 10:52:48 -0400 Subject: [PATCH 1/3] overlay renderer: use copyonwritelist for overlays The map can be rebuilt during rendering --- .../java/net/runelite/client/ui/overlay/OverlayRenderer.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java index 2843d97d32..69d5b52530 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java @@ -34,7 +34,6 @@ import java.awt.Rectangle; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; -import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -225,7 +224,7 @@ public class OverlayRenderer extends MouseListener implements KeyListener { if (value == null) { - value = new ArrayList<>(); + value = new CopyOnWriteArrayList<>(); } value.add(overlay); From 96b75e088ba7599d4a7402839e1e50f8bf87df1f Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 1 Apr 2018 10:58:26 -0400 Subject: [PATCH 2/3] overlay renderer: clip above scene and under widgets to viewport on fixed The minimap on fixed is drawn before above scene and under widgets --- .../src/main/java/net/runelite/api/Client.java | 4 ++++ .../runelite/client/ui/overlay/OverlayRenderer.java | 13 ++++++++++--- .../src/main/java/net/runelite/rs/api/RSClient.java | 8 ++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/Client.java b/runelite-api/src/main/java/net/runelite/api/Client.java index c781270dc4..fbac176655 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -76,6 +76,10 @@ public interface Client extends GameEngine int getViewportWidth(); + int getViewportXOffset(); + + int getViewportYOffset(); + int getScale(); Point getMouseCanvasPosition(); diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java index 69d5b52530..ec2e27be69 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java @@ -317,7 +317,7 @@ public class OverlayRenderer extends MouseListener implements KeyListener if (overlayPosition == OverlayPosition.DYNAMIC || overlayPosition == OverlayPosition.TOOLTIP) { - safeRender(overlay, graphics, new Point()); + safeRender(client, overlay, layer, graphics, new Point()); } else { @@ -338,7 +338,7 @@ public class OverlayRenderer extends MouseListener implements KeyListener location.setLocation(overlay.getPreferredLocation()); } - safeRender(overlay, graphics, location); + safeRender(client, overlay, layer, graphics, location); dimension.setSize(overlay.getBounds().getSize()); if (dimension.width == 0 && dimension.height == 0) @@ -488,9 +488,16 @@ public class OverlayRenderer extends MouseListener implements KeyListener } } - private void safeRender(Overlay overlay, Graphics2D graphics, Point point) + private void safeRender(Client client, Overlay overlay, OverlayLayer layer, Graphics2D graphics, Point point) { final Graphics2D subGraphics = (Graphics2D) graphics.create(); + if (!isResizeable && (layer == OverlayLayer.ABOVE_SCENE || layer == OverlayLayer.UNDER_WIDGETS)) + { + subGraphics.setClip(client.getViewportXOffset(), + client.getViewportYOffset(), + client.getViewportWidth(), + client.getViewportHeight()); + } subGraphics.translate(point.x, point.y); final Dimension dimension = MoreObjects.firstNonNull(overlay.render(subGraphics), new Dimension()); subGraphics.dispose(); diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java index f6340c4c85..48d7203dba 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSClient.java @@ -251,6 +251,14 @@ public interface RSClient extends RSGameEngine, Client @Override int getViewportWidth(); + @Import("Viewport_xOffset") + @Override + int getViewportXOffset(); + + @Import("Viewport_yOffset") + @Override + int getViewportYOffset(); + @Import("isResized") @Override boolean isResized(); From 45597133f78c3470f8270df7dfb53319d106dcd5 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 1 Apr 2018 11:15:57 -0400 Subject: [PATCH 3/3] perspective: use viewport offset in get2DGeometry --- runelite-api/src/main/java/net/runelite/api/Perspective.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/Perspective.java b/runelite-api/src/main/java/net/runelite/api/Perspective.java index 7b232103f4..7886c1feda 100644 --- a/runelite-api/src/main/java/net/runelite/api/Perspective.java +++ b/runelite-api/src/main/java/net/runelite/api/Perspective.java @@ -508,8 +508,8 @@ public class Perspective int minY = Math.min(Math.min(a.getY(), b.getY()), c.getY()); // For some reason, this calculation is always 4 pixels short of the actual in-client one - int maxX = Math.max(Math.max(a.getX(), b.getX()), c.getX()) + 4; - int maxY = Math.max(Math.max(a.getY(), b.getY()), c.getY()) + 4; + int maxX = Math.max(Math.max(a.getX(), b.getX()), c.getX()) + client.getViewportXOffset(); + int maxY = Math.max(Math.max(a.getY(), b.getY()), c.getY()) + client.getViewportYOffset(); // ...and the rectangles in the fixed client are shifted 4 pixels right and down if (!client.isResized())