001package net.minecraft.client.renderer.texture; 002 003import cpw.mods.fml.relauncher.Side; 004import cpw.mods.fml.relauncher.SideOnly; 005import java.awt.image.BufferedImage; 006import java.io.File; 007import java.io.IOException; 008import java.nio.ByteBuffer; 009import javax.imageio.ImageIO; 010import net.minecraft.client.Minecraft; 011import org.lwjgl.opengl.GL11; 012import org.lwjgl.opengl.GL12; 013import org.lwjgl.opengl.GL13; 014 015@SideOnly(Side.CLIENT) 016public class Texture 017{ 018 private int field_94293_a; 019 private int field_94291_b; 020 private int field_94292_c; 021 private final int field_94289_d; 022 private final int field_94290_e; 023 private final int field_94287_f; 024 private final int field_94288_g; 025 private final int field_94300_h; 026 private final int field_94301_i; 027 private final int field_94298_j; 028 private final int field_94299_k; 029 private final boolean field_94296_l; 030 private final String field_94297_m; 031 private Rect2i field_94294_n; 032 private boolean field_94295_o; 033 private boolean field_94304_p; 034 private boolean field_94303_q; 035 private ByteBuffer field_94302_r; 036 037 private Texture(String par1Str, int par2, int par3, int par4, int par5, int par6, int par7, int par8, int par9) 038 { 039 this.field_94297_m = par1Str; 040 this.field_94292_c = par2; 041 this.field_94289_d = par3; 042 this.field_94290_e = par4; 043 this.field_94287_f = par5; 044 this.field_94288_g = par7; 045 this.field_94301_i = par8; 046 this.field_94298_j = par9; 047 this.field_94299_k = par6; 048 this.field_94294_n = new Rect2i(0, 0, par3, par4); 049 050 if (par4 == 1 && par5 == 1) 051 { 052 this.field_94300_h = 3552; 053 } 054 else if (par5 == 1) 055 { 056 this.field_94300_h = 3553; 057 } 058 else 059 { 060 this.field_94300_h = 32879; 061 } 062 063 this.field_94296_l = par8 != 9728 && par8 != 9729 || par9 != 9728 && par9 != 9729; 064 065 if (par2 != 2) 066 { 067 this.field_94293_a = GL11.glGenTextures(); 068 GL11.glBindTexture(this.field_94300_h, this.field_94293_a); 069 GL11.glTexParameteri(this.field_94300_h, GL11.GL_TEXTURE_MIN_FILTER, par8); 070 GL11.glTexParameteri(this.field_94300_h, GL11.GL_TEXTURE_MAG_FILTER, par9); 071 GL11.glTexParameteri(this.field_94300_h, GL11.GL_TEXTURE_WRAP_S, par6); 072 GL11.glTexParameteri(this.field_94300_h, GL11.GL_TEXTURE_WRAP_T, par6); 073 } 074 else 075 { 076 this.field_94293_a = -1; 077 } 078 079 this.field_94291_b = TextureManager.func_94267_b().func_94265_c(); 080 } 081 082 public Texture(String par1Str, int par2, int par3, int par4, int par5, int par6, int par7, int par8, BufferedImage par9BufferedImage) 083 { 084 this(par1Str, par2, par3, par4, 1, par5, par6, par7, par8, par9BufferedImage); 085 } 086 087 public Texture(String par1Str, int par2, int par3, int par4, int par5, int par6, int par7, int par8, int par9, BufferedImage par10BufferedImage) 088 { 089 this(par1Str, par2, par3, par4, par5, par6, par7, par8, par9); 090 091 if (par10BufferedImage == null) 092 { 093 if (par3 != -1 && par4 != -1) 094 { 095 byte[] abyte = new byte[par3 * par4 * par5 * 4]; 096 097 for (int i2 = 0; i2 < abyte.length; ++i2) 098 { 099 abyte[i2] = 0; 100 } 101 102 this.field_94302_r = ByteBuffer.allocateDirect(abyte.length); 103 this.field_94302_r.clear(); 104 this.field_94302_r.put(abyte); 105 this.field_94302_r.position(0).limit(abyte.length); 106 107 if (this.field_94304_p) 108 { 109 this.func_94285_g(); 110 } 111 else 112 { 113 this.field_94303_q = false; 114 } 115 } 116 else 117 { 118 this.field_94295_o = false; 119 } 120 } 121 else 122 { 123 this.field_94295_o = true; 124 this.func_94278_a(par10BufferedImage); 125 126 if (par2 != 2) 127 { 128 this.func_94285_g(); 129 this.field_94304_p = false; 130 } 131 } 132 } 133 134 public final Rect2i func_94274_a() 135 { 136 return this.field_94294_n; 137 } 138 139 public void func_94272_a(Rect2i par1Rect2i, int par2) 140 { 141 if (this.field_94300_h != 32879) 142 { 143 Rect2i rect2i1 = new Rect2i(0, 0, this.field_94289_d, this.field_94290_e); 144 rect2i1.func_94156_a(par1Rect2i); 145 this.field_94302_r.position(0); 146 147 for (int j = rect2i1.func_94160_b(); j < rect2i1.func_94160_b() + rect2i1.func_94157_d(); ++j) 148 { 149 int k = j * this.field_94289_d * 4; 150 151 for (int l = rect2i1.func_94158_a(); l < rect2i1.func_94158_a() + rect2i1.func_94159_c(); ++l) 152 { 153 this.field_94302_r.put(k + l * 4 + 0, (byte)(par2 >> 24 & 255)); 154 this.field_94302_r.put(k + l * 4 + 1, (byte)(par2 >> 16 & 255)); 155 this.field_94302_r.put(k + l * 4 + 2, (byte)(par2 >> 8 & 255)); 156 this.field_94302_r.put(k + l * 4 + 3, (byte)(par2 >> 0 & 255)); 157 } 158 } 159 160 if (this.field_94304_p) 161 { 162 this.func_94285_g(); 163 } 164 else 165 { 166 this.field_94303_q = false; 167 } 168 } 169 } 170 171 public void func_94279_c(String par1Str) 172 { 173 BufferedImage bufferedimage = new BufferedImage(this.field_94289_d, this.field_94290_e, 2); 174 ByteBuffer bytebuffer = this.func_94273_h(); 175 byte[] abyte = new byte[this.field_94289_d * this.field_94290_e * 4]; 176 bytebuffer.position(0); 177 bytebuffer.get(abyte); 178 179 for (int i = 0; i < this.field_94289_d; ++i) 180 { 181 for (int j = 0; j < this.field_94290_e; ++j) 182 { 183 int k = j * this.field_94289_d * 4 + i * 4; 184 byte b0 = 0; 185 int l = b0 | (abyte[k + 2] & 255) << 0; 186 l |= (abyte[k + 1] & 255) << 8; 187 l |= (abyte[k + 0] & 255) << 16; 188 l |= (abyte[k + 3] & 255) << 24; 189 bufferedimage.setRGB(i, j, l); 190 } 191 } 192 193 this.field_94302_r.position(this.field_94289_d * this.field_94290_e * 4); 194 195 try 196 { 197 ImageIO.write(bufferedimage, "png", new File(Minecraft.getMinecraftDir(), par1Str)); 198 } 199 catch (IOException ioexception) 200 { 201 ioexception.printStackTrace(); 202 } 203 } 204 205 public void func_94281_a(int par1, int par2, Texture par3Texture, boolean par4) 206 { 207 if (this.field_94300_h != 32879) 208 { 209 ByteBuffer bytebuffer = par3Texture.func_94273_h(); 210 this.field_94302_r.position(0); 211 bytebuffer.position(0); 212 213 for (int k = 0; k < par3Texture.func_94276_e(); ++k) 214 { 215 int l = par2 + k; 216 int i1 = k * par3Texture.func_94275_d() * 4; 217 int j1 = l * this.field_94289_d * 4; 218 219 if (par4) 220 { 221 l = par2 + (par3Texture.func_94276_e() - k); 222 } 223 224 for (int k1 = 0; k1 < par3Texture.func_94275_d(); ++k1) 225 { 226 int l1 = j1 + (k1 + par1) * 4; 227 int i2 = i1 + k1 * 4; 228 229 if (par4) 230 { 231 l1 = par1 + k1 * this.field_94289_d * 4 + l * 4; 232 } 233 234 this.field_94302_r.put(l1 + 0, bytebuffer.get(i2 + 0)); 235 this.field_94302_r.put(l1 + 1, bytebuffer.get(i2 + 1)); 236 this.field_94302_r.put(l1 + 2, bytebuffer.get(i2 + 2)); 237 this.field_94302_r.put(l1 + 3, bytebuffer.get(i2 + 3)); 238 } 239 } 240 241 this.field_94302_r.position(this.field_94289_d * this.field_94290_e * 4); 242 243 if (this.field_94304_p) 244 { 245 this.func_94285_g(); 246 } 247 else 248 { 249 this.field_94303_q = false; 250 } 251 } 252 } 253 254 public void func_94278_a(BufferedImage par1BufferedImage) 255 { 256 if (this.field_94300_h != 32879) 257 { 258 int i = par1BufferedImage.getWidth(); 259 int j = par1BufferedImage.getHeight(); 260 261 if (i <= this.field_94289_d && j <= this.field_94290_e) 262 { 263 int[] aint = new int[] {3, 0, 1, 2}; 264 int[] aint1 = new int[] {3, 2, 1, 0}; 265 int[] aint2 = this.field_94288_g == 32993 ? aint1 : aint; 266 int[] aint3 = new int[this.field_94289_d * this.field_94290_e]; 267 int k = par1BufferedImage.getTransparency(); 268 par1BufferedImage.getRGB(0, 0, this.field_94289_d, this.field_94290_e, aint3, 0, i); 269 byte[] abyte = new byte[this.field_94289_d * this.field_94290_e * 4]; 270 271 for (int l = 0; l < this.field_94290_e; ++l) 272 { 273 for (int i1 = 0; i1 < this.field_94289_d; ++i1) 274 { 275 int j1 = l * this.field_94289_d + i1; 276 int k1 = j1 * 4; 277 abyte[k1 + aint2[0]] = (byte)(aint3[j1] >> 24 & 255); 278 abyte[k1 + aint2[1]] = (byte)(aint3[j1] >> 16 & 255); 279 abyte[k1 + aint2[2]] = (byte)(aint3[j1] >> 8 & 255); 280 abyte[k1 + aint2[3]] = (byte)(aint3[j1] >> 0 & 255); 281 } 282 } 283 284 this.field_94302_r = ByteBuffer.allocateDirect(abyte.length); 285 this.field_94302_r.clear(); 286 this.field_94302_r.put(abyte); 287 this.field_94302_r.limit(abyte.length); 288 289 if (this.field_94304_p) 290 { 291 this.func_94285_g(); 292 } 293 else 294 { 295 this.field_94303_q = false; 296 } 297 } 298 else 299 { 300 Minecraft.getMinecraft().func_98033_al().func_98236_b("transferFromImage called with a BufferedImage with dimensions (" + i + ", " + j + ") larger than the Texture dimensions (" + this.field_94289_d + ", " + this.field_94290_e + "). Ignoring."); 301 } 302 } 303 } 304 305 public int func_94284_b() 306 { 307 return this.field_94291_b; 308 } 309 310 public int func_94282_c() 311 { 312 return this.field_94293_a; 313 } 314 315 public int func_94275_d() 316 { 317 return this.field_94289_d; 318 } 319 320 public int func_94276_e() 321 { 322 return this.field_94290_e; 323 } 324 325 public String func_94280_f() 326 { 327 return this.field_94297_m; 328 } 329 330 public void func_94277_a(int par1) 331 { 332 if (this.field_94287_f == 1) 333 { 334 GL11.glEnable(GL11.GL_TEXTURE_2D); 335 } 336 else 337 { 338 GL11.glEnable(GL12.GL_TEXTURE_3D); 339 } 340 341 GL13.glActiveTexture(GL13.GL_TEXTURE0 + par1); 342 GL11.glBindTexture(this.field_94300_h, this.field_94293_a); 343 344 if (!this.field_94303_q) 345 { 346 this.func_94285_g(); 347 } 348 } 349 350 public void func_94285_g() 351 { 352 this.field_94302_r.flip(); 353 354 if (this.field_94290_e != 1 && this.field_94287_f != 1) 355 { 356 GL12.glTexImage3D(this.field_94300_h, 0, this.field_94288_g, this.field_94289_d, this.field_94290_e, this.field_94287_f, 0, this.field_94288_g, GL11.GL_UNSIGNED_BYTE, this.field_94302_r); 357 } 358 else if (this.field_94290_e != 1) 359 { 360 GL11.glTexImage2D(this.field_94300_h, 0, this.field_94288_g, this.field_94289_d, this.field_94290_e, 0, this.field_94288_g, GL11.GL_UNSIGNED_BYTE, this.field_94302_r); 361 } 362 else 363 { 364 GL11.glTexImage1D(this.field_94300_h, 0, this.field_94288_g, this.field_94289_d, 0, this.field_94288_g, GL11.GL_UNSIGNED_BYTE, this.field_94302_r); 365 } 366 367 this.field_94303_q = true; 368 } 369 370 public ByteBuffer func_94273_h() 371 { 372 return this.field_94302_r; 373 } 374}