001    package net.minecraft.client.renderer;
002    
003    import cpw.mods.fml.relauncher.Side;
004    import cpw.mods.fml.relauncher.SideOnly;
005    import java.awt.Graphics;
006    import java.awt.image.BufferedImage;
007    import java.awt.image.DataBufferInt;
008    import java.awt.image.ImageObserver;
009    
010    @SideOnly(Side.CLIENT)
011    public 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    }