You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
5.9 KiB
Java
151 lines
5.9 KiB
Java
package net.minecraft.util;
|
|
|
|
import cpw.mods.fml.relauncher.Side;
|
|
import cpw.mods.fml.relauncher.SideOnly;
|
|
import java.awt.image.BufferedImage;
|
|
import java.io.File;
|
|
import java.nio.IntBuffer;
|
|
import java.text.DateFormat;
|
|
import java.text.SimpleDateFormat;
|
|
import java.util.Date;
|
|
import javax.imageio.ImageIO;
|
|
import net.minecraft.client.renderer.OpenGlHelper;
|
|
import net.minecraft.client.renderer.texture.TextureUtil;
|
|
import net.minecraft.client.shader.Framebuffer;
|
|
import net.minecraft.event.ClickEvent;
|
|
import org.apache.logging.log4j.LogManager;
|
|
import org.apache.logging.log4j.Logger;
|
|
import org.lwjgl.BufferUtils;
|
|
import org.lwjgl.opengl.GL11;
|
|
import org.lwjgl.opengl.GL12;
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
public class ScreenShotHelper
|
|
{
|
|
private static final Logger logger = LogManager.getLogger();
|
|
private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss");
|
|
/** A buffer to hold pixel values returned by OpenGL. */
|
|
private static IntBuffer pixelBuffer;
|
|
/** The built-up array that contains all the pixel values returned by OpenGL. */
|
|
private static int[] pixelValues;
|
|
private static final String __OBFID = "CL_00000656";
|
|
|
|
/**
|
|
* Saves a screenshot in the game directory with a time-stamped filename. Args: gameDirectory,
|
|
* requestedWidthInPixels, requestedHeightInPixels, frameBuffer
|
|
*/
|
|
public static IChatComponent saveScreenshot(File p_148260_0_, int p_148260_1_, int p_148260_2_, Framebuffer p_148260_3_)
|
|
{
|
|
return saveScreenshot(p_148260_0_, (String)null, p_148260_1_, p_148260_2_, p_148260_3_);
|
|
}
|
|
|
|
/**
|
|
* Saves a screenshot in the game directory with the given file name (or null to generate a time-stamped name).
|
|
* Args: gameDirectory, fileName, requestedWidthInPixels, requestedHeightInPixels, frameBuffer
|
|
*/
|
|
public static IChatComponent saveScreenshot(File p_148259_0_, String p_148259_1_, int p_148259_2_, int p_148259_3_, Framebuffer p_148259_4_)
|
|
{
|
|
try
|
|
{
|
|
File file2 = new File(p_148259_0_, "screenshots");
|
|
file2.mkdir();
|
|
|
|
if (OpenGlHelper.isFramebufferEnabled())
|
|
{
|
|
p_148259_2_ = p_148259_4_.framebufferTextureWidth;
|
|
p_148259_3_ = p_148259_4_.framebufferTextureHeight;
|
|
}
|
|
|
|
int k = p_148259_2_ * p_148259_3_;
|
|
|
|
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())
|
|
{
|
|
GL11.glBindTexture(GL11.GL_TEXTURE_2D, p_148259_4_.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, p_148259_2_, p_148259_3_, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, pixelBuffer);
|
|
}
|
|
|
|
pixelBuffer.get(pixelValues);
|
|
TextureUtil.func_147953_a(pixelValues, p_148259_2_, p_148259_3_);
|
|
BufferedImage bufferedimage = null;
|
|
|
|
if (OpenGlHelper.isFramebufferEnabled())
|
|
{
|
|
bufferedimage = new BufferedImage(p_148259_4_.framebufferWidth, p_148259_4_.framebufferHeight, 1);
|
|
int l = p_148259_4_.framebufferTextureHeight - p_148259_4_.framebufferHeight;
|
|
|
|
for (int i1 = l; i1 < p_148259_4_.framebufferTextureHeight; ++i1)
|
|
{
|
|
for (int j1 = 0; j1 < p_148259_4_.framebufferWidth; ++j1)
|
|
{
|
|
bufferedimage.setRGB(j1, i1 - l, pixelValues[i1 * p_148259_4_.framebufferTextureWidth + j1]);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bufferedimage = new BufferedImage(p_148259_2_, p_148259_3_, 1);
|
|
bufferedimage.setRGB(0, 0, p_148259_2_, p_148259_3_, pixelValues, 0, p_148259_2_);
|
|
}
|
|
|
|
File file3;
|
|
|
|
if (p_148259_1_ == null)
|
|
{
|
|
file3 = getTimestampedPNGFileForDirectory(file2);
|
|
}
|
|
else
|
|
{
|
|
file3 = new File(file2, p_148259_1_);
|
|
}
|
|
|
|
ImageIO.write(bufferedimage, "png", file3);
|
|
ChatComponentText chatcomponenttext = new ChatComponentText(file3.getName());
|
|
chatcomponenttext.getChatStyle().setChatClickEvent(new ClickEvent(ClickEvent.Action.OPEN_FILE, file3.getAbsolutePath()));
|
|
chatcomponenttext.getChatStyle().setUnderlined(Boolean.valueOf(true));
|
|
return new ChatComponentTranslation("screenshot.success", new Object[] {chatcomponenttext});
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
logger.warn("Couldn\'t save screenshot", exception);
|
|
return new ChatComponentTranslation("screenshot.failure", new Object[] {exception.getMessage()});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Creates a unique PNG file in the given directory named by a timestamp. Handles cases where the timestamp alone
|
|
* is not enough to create a uniquely named file, though it still might suffer from an unlikely race condition where
|
|
* the filename was unique when this method was called, but another process or thread created a file at the same
|
|
* path immediately after this method returned.
|
|
*/
|
|
private static File getTimestampedPNGFileForDirectory(File p_74290_0_)
|
|
{
|
|
String s = dateFormat.format(new Date()).toString();
|
|
int i = 1;
|
|
|
|
while (true)
|
|
{
|
|
File file2 = new File(p_74290_0_, s + (i == 1 ? "" : "_" + i) + ".png");
|
|
|
|
if (!file2.exists())
|
|
{
|
|
return file2;
|
|
}
|
|
|
|
++i;
|
|
}
|
|
}
|
|
} |