minecraft-source/src/com/mojang/blaze3d/platform/ScreenManager.java

97 lines
3.7 KiB
Java
Raw Normal View History

2020-07-22 06:23:34 +01:00
package com.mojang.blaze3d.platform;
import org.lwjgl.glfw.GLFWMonitorCallback;
import org.lwjgl.glfw.GLFWMonitorCallbackI;
import it.unimi.dsi.fastutil.objects.ObjectIterator;
import javax.annotation.Nullable;
import org.lwjgl.PointerBuffer;
import org.lwjgl.glfw.GLFW;
2020-07-22 06:25:47 +01:00
import com.mojang.blaze3d.systems.RenderSystem;
2020-07-22 06:23:34 +01:00
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
public class ScreenManager {
private final Long2ObjectMap<Monitor> monitors;
private final MonitorCreator monitorCreator;
2020-07-22 06:30:03 +01:00
public ScreenManager(final MonitorCreator cxq) {
2020-07-22 06:23:34 +01:00
this.monitors = (Long2ObjectMap<Monitor>)new Long2ObjectOpenHashMap();
2020-07-22 06:25:47 +01:00
RenderSystem.assertThread(RenderSystem::isInInitPhase);
2020-07-22 06:30:03 +01:00
this.monitorCreator = cxq;
2020-07-22 06:23:34 +01:00
GLFW.glfwSetMonitorCallback(this::onMonitorChange);
final PointerBuffer pointerBuffer3 = GLFW.glfwGetMonitors();
if (pointerBuffer3 != null) {
for (int integer4 = 0; integer4 < pointerBuffer3.limit(); ++integer4) {
final long long5 = pointerBuffer3.get(integer4);
2020-07-22 06:30:03 +01:00
this.monitors.put(long5, cxq.createMonitor(long5));
2020-07-22 06:23:34 +01:00
}
}
}
private void onMonitorChange(final long long1, final int integer) {
2020-07-22 06:25:47 +01:00
RenderSystem.assertThread(RenderSystem::isOnRenderThread);
2020-07-22 06:23:34 +01:00
if (integer == 262145) {
this.monitors.put(long1, this.monitorCreator.createMonitor(long1));
}
else if (integer == 262146) {
this.monitors.remove(long1);
}
}
@Nullable
public Monitor getMonitor(final long long1) {
2020-07-22 06:25:47 +01:00
RenderSystem.assertThread(RenderSystem::isInInitPhase);
2020-07-22 06:23:34 +01:00
return (Monitor)this.monitors.get(long1);
}
@Nullable
2020-07-22 06:30:03 +01:00
public Monitor findBestMonitor(final Window cxx) {
final long long3 = GLFW.glfwGetWindowMonitor(cxx.getWindow());
2020-07-22 06:23:34 +01:00
if (long3 != 0L) {
return this.getMonitor(long3);
}
2020-07-22 06:30:03 +01:00
final int integer5 = cxx.getX();
final int integer6 = integer5 + cxx.getScreenWidth();
final int integer7 = cxx.getY();
final int integer8 = integer7 + cxx.getScreenHeight();
2020-07-22 06:23:34 +01:00
int integer9 = -1;
2020-07-22 06:30:03 +01:00
Monitor cxp10 = null;
for (final Monitor cxp11 : this.monitors.values()) {
final int integer10 = cxp11.getX();
final int integer11 = integer10 + cxp11.getCurrentMode().getWidth();
final int integer12 = cxp11.getY();
final int integer13 = integer12 + cxp11.getCurrentMode().getHeight();
2020-07-22 06:23:34 +01:00
final int integer14 = clamp(integer5, integer10, integer11);
final int integer15 = clamp(integer6, integer10, integer11);
final int integer16 = clamp(integer7, integer12, integer13);
final int integer17 = clamp(integer8, integer12, integer13);
final int integer18 = Math.max(0, integer15 - integer14);
final int integer19 = Math.max(0, integer17 - integer16);
final int integer20 = integer18 * integer19;
if (integer20 > integer9) {
2020-07-22 06:30:03 +01:00
cxp10 = cxp11;
2020-07-22 06:23:34 +01:00
integer9 = integer20;
}
}
2020-07-22 06:30:03 +01:00
return cxp10;
2020-07-22 06:23:34 +01:00
}
public static int clamp(final int integer1, final int integer2, final int integer3) {
if (integer1 < integer2) {
return integer2;
}
if (integer1 > integer3) {
return integer3;
}
return integer1;
}
public void shutdown() {
2020-07-22 06:25:47 +01:00
RenderSystem.assertThread(RenderSystem::isOnRenderThread);
2020-07-22 06:23:34 +01:00
final GLFWMonitorCallback gLFWMonitorCallback2 = GLFW.glfwSetMonitorCallback((GLFWMonitorCallbackI)null);
if (gLFWMonitorCallback2 != null) {
gLFWMonitorCallback2.free();
}
}
}