From 3a2a35d307bec1e983d6b7288f7c102ee27990c6 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Fri, 1 Mar 2019 18:54:57 +0100 Subject: [PATCH] Make GPU plugin DPI aware on Java 9+ Signed-off-by: Tomas Slusny --- .../client/plugins/gpu/GpuPlugin.java | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java index 93d8a522d9..7c0054ac66 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/gpu/GpuPlugin.java @@ -37,7 +37,9 @@ import com.jogamp.opengl.GLException; import com.jogamp.opengl.GLProfile; import java.awt.Canvas; import java.awt.Dimension; +import java.awt.Graphics2D; import java.awt.Image; +import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.awt.image.DataBufferInt; import java.nio.ByteBuffer; @@ -46,6 +48,7 @@ import java.nio.FloatBuffer; import java.nio.IntBuffer; import java.util.function.Function; import javax.inject.Inject; +import jogamp.nativewindow.SurfaceScaleUtils; import jogamp.nativewindow.jawt.x11.X11JAWTWindow; import jogamp.newt.awt.NewtFactoryAWT; import lombok.extern.slf4j.Slf4j; @@ -71,18 +74,7 @@ import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginInstantiationException; import net.runelite.client.plugins.PluginManager; -import static net.runelite.client.plugins.gpu.GLUtil.glDeleteBuffer; -import static net.runelite.client.plugins.gpu.GLUtil.glDeleteFrameBuffer; -import static net.runelite.client.plugins.gpu.GLUtil.glDeleteRenderbuffers; -import static net.runelite.client.plugins.gpu.GLUtil.glDeleteTexture; -import static net.runelite.client.plugins.gpu.GLUtil.glDeleteVertexArrays; -import static net.runelite.client.plugins.gpu.GLUtil.glGenBuffers; -import static net.runelite.client.plugins.gpu.GLUtil.glGetInteger; -import static net.runelite.client.plugins.gpu.GLUtil.glGenFrameBuffer; -import static net.runelite.client.plugins.gpu.GLUtil.glGenRenderbuffer; -import static net.runelite.client.plugins.gpu.GLUtil.glGenTexture; -import static net.runelite.client.plugins.gpu.GLUtil.glGenVertexArrays; -import static net.runelite.client.plugins.gpu.GLUtil.inputStreamToString; +import static net.runelite.client.plugins.gpu.GLUtil.*; import net.runelite.client.plugins.gpu.config.AntiAliasingMode; import net.runelite.client.plugins.gpu.template.Template; import net.runelite.client.ui.DrawManager; @@ -1021,7 +1013,7 @@ public class GpuPlugin extends Plugin implements DrawCallbacks renderWidthOff = (int) Math.floor(scaleFactorX * (renderWidthOff )) - padding; } - gl.glViewport(renderWidthOff, renderCanvasHeight - renderViewportHeight - renderHeightOff, renderViewportWidth, renderViewportHeight); + glDpiAwareViewport(renderWidthOff, renderCanvasHeight - renderViewportHeight - renderHeightOff, renderViewportWidth, renderViewportHeight); gl.glUseProgram(glProgram); @@ -1154,11 +1146,11 @@ public class GpuPlugin extends Plugin implements DrawCallbacks if (client.isStretchedEnabled()) { Dimension dim = client.getStretchedDimensions(); - gl.glViewport(0, 0, dim.width, dim.height); + glDpiAwareViewport(0, 0, dim.width, dim.height); } else { - gl.glViewport(0, 0, canvasWidth, canvasHeight); + glDpiAwareViewport(0, 0, canvasWidth, canvasHeight); } // Use the texture bound in the first pass @@ -1453,4 +1445,18 @@ public class GpuPlugin extends Plugin implements DrawCallbacks } } + private int getScaledValue(final double scale, final int value) + { + return SurfaceScaleUtils.scale(value, (float) scale); + } + + private void glDpiAwareViewport(final int x, final int y, final int width, final int height) + { + final AffineTransform t = ((Graphics2D) canvas.getGraphics()).getTransform(); + gl.glViewport( + getScaledValue(t.getScaleX(), x), + getScaledValue(t.getScaleY(), y), + getScaledValue(t.getScaleX(), width), + getScaledValue(t.getScaleY(), height)); + } }