The way to fix this is to make the Display resizable after you set fullscreen.
{{
Display.setFullscreen(fullscreen);
Display.setResizable(false);
Display.setResizable(true);
}}
It needs to be set to false first because the implementation caches the last value and will not update the Window if it is already resizable in the cached state.
I can confirm that this is a LWJGL bug though, the Windows backbend doesn't properly setup the window with the current state of the Display class. Hence why you need to make it not resizable to clear the window state in the backbend, this clears the cache and allows the backend to set the resizable flag on the window.
I checked the LWJGL patch that fixed this issue on there end. It appears that you would need to set the window to resizable after exiting full screen, at least on Windows hosts.
This is a pretty easy thing to fix, it's a two line change.
Using fabric names, in net.minecraft.client.textyre.Sprite$Interpolation.apply()V it does:
for(int y = 0; y < n; ++y) {
for(int x = 0; x < m; ++x) {
int dest = getPixelColor(i, l, x, y);
int source = getPixelColor(k, l, x, y);
int red = lerp(delta, dest >> 16 & 255, source >> 16 & 255);
int green = lerp(delta, dest >> 8 & 255, source >> 8 & 255);
int blue = lerp(delta, dest & 255, source & 255);
images[l].setPixelColor(x, y, (source & 0xFF000000 ) | (red << 16) | (green << 8) | blue);
}
}
And a fixed version would be as follows:
for(int y = 0; y < n; ++y) {
for(int x = 0; x < m; ++x) {
int dest = getPixelColor(i, l, x, y);
int source = getPixelColor(k, l, x, y);
int red = lerp(delta, dest >> 16 & 255, source >> 16 & 255);
int green = lerp(delta, dest >> 8 & 255, source >> 8 & 255);
int blue = lerp(delta, dest & 255, source & 255);
int alpha = lerp(delta, (dest >>> 24) & 255, (source >>> 24) & 255);
images[l].setPixelColor(x, y, (alpha << 24) | (red << 16) | (green << 8) | blue);
}
}
Same on 1.8.8 and 15w39b.
Screenshot of the problem.
@SunCat I did not find that when I searched, sorry about that.
The way to fix this is to make the Display resizable after you set fullscreen.
{{
Display.setFullscreen(fullscreen);
Display.setResizable(false);
Display.setResizable(true);
}}
It needs to be set to false first because the implementation caches the last value and will not update the Window if it is already resizable in the cached state.
I also made a quick mod and put it on Curse. "Fullscreen Fix"
I can confirm that this is a LWJGL bug though, the Windows backbend doesn't properly setup the window with the current state of the Display class. Hence why you need to make it not resizable to clear the window state in the backbend, this clears the cache and allows the backend to set the resizable flag on the window.
I checked the LWJGL patch that fixed this issue on there end. It appears that you would need to set the window to resizable after exiting full screen, at least on Windows hosts.
Source.
I would argue that this is a bug, the implemented PNG scrubbing is being to aggressive.
However, I will make a request of the feedback site as advised.
This is a pretty easy thing to fix, it's a two line change.
Using fabric names, in net.minecraft.client.textyre.Sprite$Interpolation.apply()V it does:
And a fixed version would be as follows:
The change is more specifically:
becomes
int alpha = lerp(delta, (dest >>> 24) & 255, (source >>> 24) & 255); images[l].setPixelColor(x, y, (alpha << 24) | (red << 16) | (green << 8) | blue);It is because the alpha was always being used from the "source" texture of the interpolation pass. This makes it so the alpha is always interpolated.
I don't believe so, but it is a minor issue that may make debugging issues related to the windowing system harder.