001package net.minecraft.client.renderer;
002
003import cpw.mods.fml.relauncher.Side;
004import cpw.mods.fml.relauncher.SideOnly;
005import java.awt.Graphics;
006import java.awt.image.BufferedImage;
007import java.awt.image.DataBufferInt;
008import java.awt.image.ImageObserver;
009
010@SideOnly(Side.CLIENT)
011public class ImageBufferDownload implements IImageBuffer
012{
013    private int[] imageData;
014    private int imageWidth;
015    private int imageHeight;
016
017    public BufferedImage parseUserSkin(BufferedImage par1BufferedImage)
018    {
019        if (par1BufferedImage == null)
020        {
021            return null;
022        }
023        else
024        {
025            this.imageWidth = 64;
026            this.imageHeight = 32;
027            BufferedImage var2 = new BufferedImage(this.imageWidth, this.imageHeight, 2);
028            Graphics var3 = var2.getGraphics();
029            var3.drawImage(par1BufferedImage, 0, 0, (ImageObserver)null);
030            var3.dispose();
031            this.imageData = ((DataBufferInt)var2.getRaster().getDataBuffer()).getData();
032            this.setAreaOpaque(0, 0, 32, 16);
033            this.setAreaTransparent(32, 0, 64, 32);
034            this.setAreaOpaque(0, 16, 64, 32);
035            boolean var4 = false;
036            int var5;
037            int var6;
038            int var7;
039
040            for (var5 = 32; var5 < 64; ++var5)
041            {
042                for (var6 = 0; var6 < 16; ++var6)
043                {
044                    var7 = this.imageData[var5 + var6 * 64];
045
046                    if ((var7 >> 24 & 255) < 128)
047                    {
048                        var4 = true;
049                    }
050                }
051            }
052
053            if (!var4)
054            {
055                for (var5 = 32; var5 < 64; ++var5)
056                {
057                    for (var6 = 0; var6 < 16; ++var6)
058                    {
059                        var7 = this.imageData[var5 + var6 * 64];
060
061                        if ((var7 >> 24 & 255) < 128)
062                        {
063                            var4 = true;
064                        }
065                    }
066                }
067            }
068
069            return var2;
070        }
071    }
072
073    /**
074     * Makes the given area of the image transparent if it was previously completely opaque (used to remove the outer
075     * layer of a skin around the head if it was saved all opaque; this would be redundant so it's assumed that the skin
076     * maker is just using an image editor without an alpha channel)
077     */
078    private void setAreaTransparent(int par1, int par2, int par3, int par4)
079    {
080        if (!this.hasTransparency(par1, par2, par3, par4))
081        {
082            for (int var5 = par1; var5 < par3; ++var5)
083            {
084                for (int var6 = par2; var6 < par4; ++var6)
085                {
086                    this.imageData[var5 + var6 * this.imageWidth] &= 16777215;
087                }
088            }
089        }
090    }
091
092    /**
093     * Makes the given area of the image opaque
094     */
095    private void setAreaOpaque(int par1, int par2, int par3, int par4)
096    {
097        for (int var5 = par1; var5 < par3; ++var5)
098        {
099            for (int var6 = par2; var6 < par4; ++var6)
100            {
101                this.imageData[var5 + var6 * this.imageWidth] |= -16777216;
102            }
103        }
104    }
105
106    /**
107     * Returns true if the given area of the image contains transparent pixels
108     */
109    private boolean hasTransparency(int par1, int par2, int par3, int par4)
110    {
111        for (int var5 = par1; var5 < par3; ++var5)
112        {
113            for (int var6 = par2; var6 < par4; ++var6)
114            {
115                int var7 = this.imageData[var5 + var6 * this.imageWidth];
116
117                if ((var7 >> 24 & 255) < 128)
118                {
119                    return true;
120                }
121            }
122        }
123
124        return false;
125    }
126}