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 }