diff --git a/client/src/main/java/GameShell.java b/client/src/main/java/GameShell.java index 8ab716f..208b6f1 100644 --- a/client/src/main/java/GameShell.java +++ b/client/src/main/java/GameShell.java @@ -119,6 +119,10 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene public static double canvasScale = 1.0d; + public static double subpixelX = 0.5d; + + public static double subpixelY = 0.5d; + @OriginalMember(owner = "client!rc", name = "providesignlink", descriptor = "(Lsignlink!ll;)V") public static void providesignlink(@OriginalArg(0) SignLink signLink) { GameShell.signLink = signLink; @@ -232,7 +236,14 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene } else { canvasScale = 1.0d; } - System.out.println("Scaling factor: " + canvasScale); + if (Math.floor(canvasScale) != canvasScale) { + subpixelX = 0.0d; + subpixelY = -0.5d; + } else { + subpixelX = 0.5d; + subpixelY = 0.5d; + } + System.out.println("Scaling factor: " + canvasScale + "x, using fractional scaling"); } if (container == frame) { @Pc(66) Insets insets = frame.getInsets(); @@ -391,6 +402,13 @@ public abstract class GameShell extends Applet implements Runnable, FocusListene if (g != null) { if (g instanceof Graphics2D) { canvasScale = ((Graphics2D) g).getTransform().getScaleX(); + if (Math.floor(canvasScale) != canvasScale) { + subpixelX = 0.0d; + subpixelY = -0.5d; + } else { + subpixelX = 0.5d; + subpixelY = 0.5d; + } } else { canvasScale = 1.0; } diff --git a/client/src/main/java/GlRenderer.java b/client/src/main/java/GlRenderer.java index cf43091..6938185 100644 --- a/client/src/main/java/GlRenderer.java +++ b/client/src/main/java/GlRenderer.java @@ -755,8 +755,8 @@ public final class GlRenderer { @OriginalMember(owner = "client!gi", name = "b", descriptor = "()V") private static void resizeViewport() { - gl.glViewport((int) (leftMargin * GameShell.canvasScale), (int) (topMargin * GameShell.canvasScale - 0.5d), - (int) (viewportWidth * GameShell.canvasScale), (int) (viewportHeight * GameShell.canvasScale - 0.5d)); + gl.glViewport((int) (leftMargin * GameShell.canvasScale + GameShell.subpixelX), (int) (topMargin * GameShell.canvasScale + GameShell.subpixelY), + (int) (viewportWidth * GameShell.canvasScale + GameShell.subpixelX), (int) (viewportHeight * GameShell.canvasScale + GameShell.subpixelY)); } @OriginalMember(owner = "client!tf", name = "a", descriptor = "(IIIIII)V") diff --git a/client/src/main/java/Static46.java b/client/src/main/java/Static46.java index 2804f48..eccf88a 100644 --- a/client/src/main/java/Static46.java +++ b/client/src/main/java/Static46.java @@ -197,7 +197,7 @@ public final class Static46 { @Pc(21) GL2 gl = GlRenderer.gl; gl.glEnable(GL2.GL_SCISSOR_TEST); if (clipX <= anInt1440 && clipY <= anInt1441) { - gl.glScissor((int)(clipX * GameShell.canvasScale), (int)((GlRenderer.canvasHeight - anInt1441) * GameShell.canvasScale - 0.5d), (int)((anInt1440 - clipX) * GameShell.canvasScale), (int)((anInt1441 - clipY) * GameShell.canvasScale - 0.5d)); + gl.glScissor((int)(clipX * GameShell.canvasScale + GameShell.subpixelX), (int)((GlRenderer.canvasHeight - anInt1441) * GameShell.canvasScale + GameShell.subpixelY), (int)((anInt1440 - clipX) * GameShell.canvasScale + GameShell.subpixelX), (int)((anInt1441 - clipY) * GameShell.canvasScale + GameShell.subpixelY)); } else { gl.glScissor(0, 0, 0, 0); } @@ -262,7 +262,7 @@ public final class Static46 { @Pc(27) GL2 local27 = GlRenderer.gl; local27.glEnable(GL2.GL_SCISSOR_TEST); if (clipX <= anInt1440 && clipY <= anInt1441) { - local27.glScissor((int)(clipX * GameShell.canvasScale), (int)((GlRenderer.canvasHeight - anInt1441) * GameShell.canvasScale - 0.5d), (int)((anInt1440 - clipX) * GameShell.canvasScale), (int)((anInt1441 - clipY) * GameShell.canvasScale - 0.5d)); + local27.glScissor((int)(clipX * GameShell.canvasScale + GameShell.subpixelX), (int)((GlRenderer.canvasHeight - anInt1441) * GameShell.canvasScale + GameShell.subpixelY), (int)((anInt1440 - clipX) * GameShell.canvasScale + GameShell.subpixelX), (int)((anInt1441 - clipY) * GameShell.canvasScale + GameShell.subpixelY)); } else { local27.glScissor(0, 0, 0, 0); }