package net.minecraft.util;
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.GlStateManager;
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;
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 var5 = new File(p_148259_0_, "screenshots");
var5.mkdir();
if (OpenGlHelper.isFramebufferEnabled())
{
p_148259_2_ = p_148259_4_.framebufferTextureWidth;
p_148259_3_ = p_148259_4_.framebufferTextureHeight;
}
int var6 = p_148259_2_ * p_148259_3_;
if (pixelBuffer == null || pixelBuffer.capacity() < var6)
{
pixelBuffer = BufferUtils.createIntBuffer(var6);
pixelValues = new int[var6];
}
GL11.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 1);
GL11.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1);
pixelBuffer.clear();
if (OpenGlHelper.isFramebufferEnabled())
{
GlStateManager.func_179144_i(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 var7 = null;
if (OpenGlHelper.isFramebufferEnabled())
{
var7 = new BufferedImage(p_148259_4_.framebufferWidth, p_148259_4_.framebufferHeight, 1);
int var8 = p_148259_4_.framebufferTextureHeight - p_148259_4_.framebufferHeight;
for (int var9 = var8; var9 < p_148259_4_.framebufferTextureHeight; ++var9)
{
for (int var10 = 0; var10 < p_148259_4_.framebufferWidth; ++var10)
{
var7.setRGB(var10, var9 - var8, pixelValues[var9 * p_148259_4_.framebufferTextureWidth + var10]);
}
}
}
else
{
var7 = new BufferedImage(p_148259_2_, p_148259_3_, 1);
var7.setRGB(0, 0, p_148259_2_, p_148259_3_, pixelValues, 0, p_148259_2_);
}
File var12;
if (p_148259_1_ == null)
{
var12 = getTimestampedPNGFileForDirectory(var5);
}
else
{
var12 = new File(var5, p_148259_1_);
}
ImageIO.write(var7, "png", var12);
ChatComponentText var13 = new ChatComponentText(var12.getName());
var13.getChatStyle().setChatClickEvent(new ClickEvent(ClickEvent.Action.OPEN_FILE, var12.getAbsolutePath()));
var13.getChatStyle().setUnderlined(Boolean.valueOf(true));
return new ChatComponentTranslation("screenshot.success", new Object[] {var13});
}
catch (Exception var11)
{
logger.warn("Couldn\'t save screenshot", var11);
return new ChatComponentTranslation("screenshot.failure", new Object[] {var11.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 var2 = dateFormat.format(new Date()).toString();
int var3 = 1;
while (true)
{
File var1 = new File(p_74290_0_, var2 + (var3 == 1 ? "" : "_" + var3) + ".png");
if (!var1.exists())
{
return var1;
}
++var3;
}
}
}