86 lines
2.4 KiB
Java
86 lines
2.4 KiB
Java
package eu.crushedpixel.replaymod.video;
|
|
|
|
import java.awt.AWTException;
|
|
import java.awt.Rectangle;
|
|
import java.awt.Robot;
|
|
import java.awt.image.BufferedImage;
|
|
import java.nio.IntBuffer;
|
|
|
|
import net.minecraft.client.Minecraft;
|
|
import net.minecraft.client.renderer.GlStateManager;
|
|
import net.minecraft.client.renderer.OpenGlHelper;
|
|
import net.minecraft.client.renderer.texture.TextureUtil;
|
|
import net.minecraft.client.shader.Framebuffer;
|
|
|
|
import org.lwjgl.BufferUtils;
|
|
import org.lwjgl.opengl.GL11;
|
|
import org.lwjgl.opengl.GL12;
|
|
import org.monte.screenrecorder.ScreenRecorder;
|
|
|
|
public class ScreenCapture {
|
|
|
|
private static final Minecraft mc = Minecraft.getMinecraft();
|
|
|
|
private static IntBuffer pixelBuffer;
|
|
private static int[] pixelValues;
|
|
|
|
public static BufferedImage captureScreen() {
|
|
int width = mc.displayWidth;
|
|
int height = mc.displayHeight;
|
|
|
|
Framebuffer buffer = mc.getFramebuffer();
|
|
|
|
if (OpenGlHelper.isFramebufferEnabled())
|
|
{
|
|
width = buffer.framebufferTextureWidth;
|
|
height = buffer.framebufferTextureHeight;
|
|
}
|
|
|
|
int k = width * height;
|
|
|
|
if (pixelBuffer == null || pixelBuffer.capacity() < k)
|
|
{
|
|
pixelBuffer = BufferUtils.createIntBuffer(k);
|
|
pixelValues = new int[k];
|
|
}
|
|
|
|
GL11.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 1);
|
|
GL11.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1);
|
|
pixelBuffer.clear();
|
|
|
|
if (OpenGlHelper.isFramebufferEnabled()) {
|
|
GlStateManager.bindTexture(buffer.framebufferTexture);
|
|
GL11.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, pixelBuffer);
|
|
}
|
|
else {
|
|
GL11.glReadPixels(0, 0, width, height, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, pixelBuffer);
|
|
}
|
|
|
|
pixelBuffer.get(pixelValues);
|
|
TextureUtil.processPixelValues(pixelValues, width, height);
|
|
BufferedImage bufferedimage = null;
|
|
|
|
|
|
if (OpenGlHelper.isFramebufferEnabled())
|
|
{
|
|
bufferedimage = new BufferedImage(buffer.framebufferWidth, buffer.framebufferHeight, 1);
|
|
int l = buffer.framebufferTextureHeight - buffer.framebufferHeight;
|
|
|
|
for (int i1 = l; i1 < buffer.framebufferTextureHeight; ++i1)
|
|
{
|
|
for (int j1 = 0; j1 < buffer.framebufferWidth; ++j1)
|
|
{
|
|
bufferedimage.setRGB(j1, i1 - l, pixelValues[i1 * buffer.framebufferTextureWidth + j1]);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
bufferedimage = new BufferedImage(width, height, 1);
|
|
bufferedimage.setRGB(0, 0, width, height, pixelValues, 0, width);
|
|
}
|
|
|
|
|
|
return bufferedimage;
|
|
}
|
|
}
|