Skip to content

Commit 58b9064

Browse files
committed
Fix Windows resize issues
1 parent e3ca601 commit 58b9064

5 files changed

Lines changed: 33 additions & 23 deletions

File tree

minecraft/src/main/java/org/polyfrost/oneconfig/api/platform/v1/internal/ScreenPlatformImpl.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@
3434

3535
public class ScreenPlatformImpl implements ScreenPlatform {
3636
//#if MC > 1.13
37-
//$$ private final float[] pixelScaleFactor = new float[1];
37+
//$$ private final int[] fbWidth = new int[1];
38+
//$$ private final int[] winWidth = new int[1];
3839
//#endif
3940

4041
@Override
@@ -73,18 +74,21 @@ public int windowHeight() {
7374
//#endif
7475
}
7576

76-
// todo: https://github.com/Polyfrost/OneConfig/issues/478
77-
// this override was removed to avoid the system receiving incorrect/inaccurate pixel ratio values
78-
// while the window was being resized (as it was calculated based on viewport / window size)
79-
// so we use the (well what was assumed to be correct) values provided by GLFW on modern versions.
80-
// however, this is not actually correct as shown by issue #478 (above), so we will remove this override for now.
81-
// this may have been fixed in GLFW v3.4; but Minecraft is not using that version yet. see https://github.com/glfw/glfw/pull/2457.
77+
// On macOS, glfwGetWindowContentScale == framebufferSize / windowSize (e.g. 2.0 on Retina).
78+
// On Windows, they differ: framebuffer == window (ratio 1.0), but contentScale reflects DPI (e.g. 1.5).
79+
// Using contentScale as pixelRatio on Windows caused the UI to be rendered at the wrong size (#478).
80+
// Fix: compute the actual framebuffer-to-window ratio directly from GLFW, which is correct on all platforms.
81+
// See also: https://github.com/glfw/glfw/pull/2457
8282
@Override
8383
public float pixelRatio() {
84-
// asm: considerably more reliable than just doing viewport / window
8584
//#if MC > 1.13
86-
//$$ org.lwjgl.glfw.GLFW.glfwGetWindowContentScale(Minecraft.getInstance().getWindow().getWindow(), pixelScaleFactor, null);
87-
//$$ return pixelScaleFactor[0];
85+
//$$ long handle = Minecraft.getInstance().getWindow().getWindow();
86+
//$$ org.lwjgl.glfw.GLFW.glfwGetFramebufferSize(handle, fbWidth, null);
87+
//$$ org.lwjgl.glfw.GLFW.glfwGetWindowSize(handle, winWidth, null);
88+
//$$ if (winWidth[0] > 0) {
89+
//$$ return (float) fbWidth[0] / winWidth[0];
90+
//$$ }
91+
//$$ return 1.0f;
8892
//#else
8993
return org.lwjgl.opengl.Display.getPixelScaleFactor();
9094
//#endif

minecraft/src/main/java/org/polyfrost/oneconfig/api/ui/v1/internal/wrappers/PolyUIScreen.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -286,9 +286,9 @@ protected final void adjustResolution(float w, float h, boolean force) {
286286

287287
try {
288288
float ratio = Platform.screen().pixelRatio();
289-
// framebuffer should you know probably be the correct larger size because.. well yeah of course it does
290-
// didn't anyone think of that?
291-
polyUI.resize(initialWidth * sx, initialHeight * sy, force);
289+
float newW = initialWidth * sx;
290+
float newH = initialHeight * sy;
291+
polyUI.resize(newW, newH, force);
292292
polyUI.getWindow().setPixelRatio(ratio);
293293
} catch (Exception e) {
294294
death(e);

modules/ui/api/ui.api

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -127,26 +127,25 @@ public abstract interface class org/polyfrost/oneconfig/api/ui/v1/api/RendererEx
127127
}
128128

129129
public abstract interface class org/polyfrost/oneconfig/api/ui/v1/api/StbApi {
130-
public abstract fun font_CreateFontInfo ()J
130+
public abstract fun font_CreateFontInfo ()Lorg/polyfrost/oneconfig/api/ui/v1/api/StbApi$StbFontInfo;
131131
public abstract fun font_CreatePackContext ()J
132132
public abstract fun font_CreatePackRange ()J
133133
public abstract fun font_CreatePackedCharArray (I)J
134-
public abstract fun font_FindGlyphIndex (JI)I
135-
public abstract fun font_GetFontVMetrics (J[I[I[I)V
136-
public abstract fun font_GetGlyphBitmap (JFFI[I[I[I[I)J
137-
public abstract fun font_GetGlyphHMetrics (JI[I[I)V
138-
public abstract fun font_GetGlyphSDF (JFIIBF[I[I[I[I)J
134+
public abstract fun font_FindGlyphIndex (Lorg/polyfrost/oneconfig/api/ui/v1/api/StbApi$StbFontInfo;I)I
135+
public abstract fun font_GetFontVMetrics (Lorg/polyfrost/oneconfig/api/ui/v1/api/StbApi$StbFontInfo;[I[I[I)V
136+
public abstract fun font_GetGlyphBitmap (Lorg/polyfrost/oneconfig/api/ui/v1/api/StbApi$StbFontInfo;FFI[I[I[I[I)Ljava/nio/ByteBuffer;
137+
public abstract fun font_GetGlyphHMetrics (Lorg/polyfrost/oneconfig/api/ui/v1/api/StbApi$StbFontInfo;I[I[I)V
138+
public abstract fun font_GetGlyphSDF (Lorg/polyfrost/oneconfig/api/ui/v1/api/StbApi$StbFontInfo;FIIBF[I[I[I[I)Ljava/nio/ByteBuffer;
139139
public abstract fun font_GetPackedGlyph (JI)J
140-
public abstract fun font_InitFont (JLjava/nio/ByteBuffer;)Z
140+
public abstract fun font_InitFont (Lorg/polyfrost/oneconfig/api/ui/v1/api/StbApi$StbFontInfo;Ljava/nio/ByteBuffer;)Z
141141
public abstract fun font_PackBegin (JLjava/nio/ByteBuffer;IIIIJ)Z
142142
public abstract fun font_PackEnd (J)V
143143
public abstract fun font_PackFontRange (JLjava/nio/ByteBuffer;IFIIJ)Z
144144
public abstract fun font_RangeSetChardata (JJ)V
145145
public abstract fun font_RangeSetFirstUnicodeCodepointInRange (JI)V
146146
public abstract fun font_RangeSetFontSize (JF)V
147147
public abstract fun font_RangeSetNumChars (JI)V
148-
public abstract fun font_ScaleForMappingEmToPixels (JF)F
149-
public abstract fun free (J)V
148+
public abstract fun font_ScaleForMappingEmToPixels (Lorg/polyfrost/oneconfig/api/ui/v1/api/StbApi$StbFontInfo;F)F
150149
public abstract fun glyph_x0 (J)S
151150
public abstract fun glyph_x1 (J)S
152151
public abstract fun glyph_xadvance (J)F
@@ -160,6 +159,11 @@ public abstract interface class org/polyfrost/oneconfig/api/ui/v1/api/StbApi {
160159
public abstract fun image_write_png (Ljava/lang/String;IIILjava/nio/ByteBuffer;I)V
161160
}
162161

162+
public abstract interface class org/polyfrost/oneconfig/api/ui/v1/api/StbApi$StbFontInfo {
163+
public abstract fun address ()J
164+
public abstract fun free ()V
165+
}
166+
163167
public abstract interface class org/polyfrost/oneconfig/api/ui/v1/api/TinyFdApi {
164168
public static final field ERROR_ICON Ljava/lang/String;
165169
public static final field INFO_ICON Ljava/lang/String;

modules/ui/src/main/java/org/polyfrost/oneconfig/api/ui/v1/UIManager.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,6 @@ default PolyUI createDefault() {
195195
long size = polyUI.getSize();
196196
int polyUiWidth = (int) Vec2.getX(size);
197197
int polyUiHeight = (int) Vec2.getY(size);
198-
System.out.println("Resizing to: " + polyUiWidth + "x" + polyUiHeight + " with ratio " + ratio);
199198
framebuffer.resize((int) (polyUiWidth * ratio), (int) (polyUiHeight * ratio));
200199
polyUI.getWindow().setPixelRatio(ratio);
201200
});

modules/utils/api/utils.api

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public abstract interface class org/polyfrost/oneconfig/api/platform/v1/Compatib
5353

5454
public abstract interface class org/polyfrost/oneconfig/api/platform/v1/GLPlatform {
5555
public abstract fun getFunctionAddress (Ljava/lang/String;)J
56+
public abstract fun glVertexAttribIPointer (IIIIJ)V
5657
public fun glViewport ()[I
5758
public abstract fun glViewport ([I)[I
5859
public abstract fun memAddress (Ljava/nio/ByteBuffer;)J
@@ -81,7 +82,9 @@ public abstract interface class org/polyfrost/oneconfig/api/platform/v1/ScreenPl
8182
public abstract fun current ()Ljava/lang/Object;
8283
public fun display (Ljava/lang/Object;)V
8384
public abstract fun display (Ljava/lang/Object;I)V
85+
public fun mcToScreenScale ()F
8486
public fun pixelRatio ()F
87+
public fun screenToMcScale ()F
8588
public abstract fun viewportHeight ()I
8689
public abstract fun viewportWidth ()I
8790
public abstract fun windowHeight ()I

0 commit comments

Comments
 (0)