001package net.minecraft.client.renderer.texture; 002 003import cpw.mods.fml.relauncher.Side; 004import cpw.mods.fml.relauncher.SideOnly; 005import java.util.ArrayList; 006import java.util.Arrays; 007import java.util.HashSet; 008import java.util.Iterator; 009import java.util.List; 010import java.util.Set; 011import net.minecraft.client.renderer.StitcherException; 012 013@SideOnly(Side.CLIENT) 014public class Stitcher 015{ 016 private final Set field_94319_a; 017 private final List field_94317_b; 018 private int field_94318_c; 019 private int field_94315_d; 020 private final int field_94316_e; 021 private final int field_94313_f; 022 private final boolean field_94314_g; 023 private final int field_94323_h; 024 private Texture field_94322_k; 025 private final String field_94320_l; 026 027 public Stitcher(String par1Str, int par2, int par3, boolean par4) 028 { 029 this(par1Str, par2, par3, par4, 0); 030 } 031 032 public Stitcher(String par1, int par2, int par3, boolean par4, int par5) 033 { 034 this.field_94319_a = new HashSet(256); 035 this.field_94317_b = new ArrayList(256); 036 this.field_94318_c = 0; 037 this.field_94315_d = 0; 038 this.field_94320_l = par1; 039 this.field_94316_e = par2; 040 this.field_94313_f = par3; 041 this.field_94314_g = par4; 042 this.field_94323_h = par5; 043 } 044 045 public void func_94312_a(StitchHolder par1StitchHolder) 046 { 047 if (this.field_94323_h > 0) 048 { 049 par1StitchHolder.func_94196_a(this.field_94323_h); 050 } 051 052 this.field_94319_a.add(par1StitchHolder); 053 } 054 055 public Texture func_94306_e() 056 { 057 if (this.field_94314_g) 058 { 059 this.field_94318_c = this.func_94308_a(this.field_94318_c); 060 this.field_94315_d = this.func_94308_a(this.field_94315_d); 061 } 062 063 this.field_94322_k = TextureManager.func_94267_b().func_98145_a(this.field_94320_l, 1, this.field_94318_c, this.field_94315_d, 6408); 064 this.field_94322_k.func_94272_a(this.field_94322_k.func_94274_a(), -65536); 065 List list = this.func_94309_g(); 066 067 for (int i = 0; i < list.size(); ++i) 068 { 069 StitchSlot stitchslot = (StitchSlot)list.get(i); 070 StitchHolder stitchholder = stitchslot.func_94183_a(); 071 this.field_94322_k.func_94281_a(stitchslot.func_94186_b(), stitchslot.func_94185_c(), stitchholder.func_98150_a(), stitchholder.func_94195_e()); 072 } 073 074 TextureManager.func_94267_b().func_94264_a(this.field_94320_l, this.field_94322_k); 075 return this.field_94322_k; 076 } 077 078 public void func_94305_f() 079 { 080 StitchHolder[] astitchholder = (StitchHolder[])this.field_94319_a.toArray(new StitchHolder[this.field_94319_a.size()]); 081 Arrays.sort(astitchholder); 082 this.field_94322_k = null; 083 084 for (int i = 0; i < astitchholder.length; ++i) 085 { 086 StitchHolder stitchholder = astitchholder[i]; 087 088 if (!this.func_94310_b(stitchholder)) 089 { 090 throw new StitcherException(stitchholder); 091 } 092 } 093 } 094 095 public List func_94309_g() 096 { 097 ArrayList arraylist = new ArrayList(); 098 Iterator iterator = this.field_94317_b.iterator(); 099 100 while (iterator.hasNext()) 101 { 102 StitchSlot stitchslot = (StitchSlot)iterator.next(); 103 stitchslot.func_94184_a(arraylist); 104 } 105 106 return arraylist; 107 } 108 109 private int func_94308_a(int par1) 110 { 111 int j = par1 - 1; 112 j |= j >> 1; 113 j |= j >> 2; 114 j |= j >> 4; 115 j |= j >> 8; 116 j |= j >> 16; 117 return j + 1; 118 } 119 120 private boolean func_94310_b(StitchHolder par1StitchHolder) 121 { 122 for (int i = 0; i < this.field_94317_b.size(); ++i) 123 { 124 if (((StitchSlot)this.field_94317_b.get(i)).func_94182_a(par1StitchHolder)) 125 { 126 return true; 127 } 128 129 par1StitchHolder.func_94194_d(); 130 131 if (((StitchSlot)this.field_94317_b.get(i)).func_94182_a(par1StitchHolder)) 132 { 133 return true; 134 } 135 136 par1StitchHolder.func_94194_d(); 137 } 138 139 return this.func_94311_c(par1StitchHolder); 140 } 141 142 private boolean func_94311_c(StitchHolder par1StitchHolder) 143 { 144 int i = Math.min(par1StitchHolder.func_94199_b(), par1StitchHolder.func_94197_a()); 145 boolean flag = this.field_94318_c == 0 && this.field_94315_d == 0; 146 boolean flag1; 147 148 if (this.field_94314_g) 149 { 150 int j = this.func_94308_a(this.field_94318_c); 151 int k = this.func_94308_a(this.field_94315_d); 152 int l = this.func_94308_a(this.field_94318_c + i); 153 int i1 = this.func_94308_a(this.field_94315_d + i); 154 boolean flag2 = l <= this.field_94316_e; 155 boolean flag3 = i1 <= this.field_94313_f; 156 157 if (!flag2 && !flag3) 158 { 159 return false; 160 } 161 162 int j1 = Math.max(par1StitchHolder.func_94199_b(), par1StitchHolder.func_94197_a()); 163 164 if (flag && !flag2 && this.func_94308_a(this.field_94315_d + j1) > this.field_94313_f) 165 { 166 return false; 167 } 168 169 boolean flag4 = j != l; 170 boolean flag5 = k != i1; 171 172 if (flag4 ^ flag5) 173 { 174 flag1 = flag4 && flag2; 175 } 176 else 177 { 178 flag1 = flag2 && j <= k; 179 } 180 } 181 else 182 { 183 boolean flag6 = this.field_94318_c + i <= this.field_94316_e; 184 boolean flag7 = this.field_94315_d + i <= this.field_94313_f; 185 186 if (!flag6 && !flag7) 187 { 188 return false; 189 } 190 191 flag1 = (flag || this.field_94318_c <= this.field_94315_d) && flag6; 192 } 193 194 StitchSlot stitchslot; 195 196 if (flag1) 197 { 198 if (par1StitchHolder.func_94197_a() > par1StitchHolder.func_94199_b()) 199 { 200 par1StitchHolder.func_94194_d(); 201 } 202 203 if (this.field_94315_d == 0) 204 { 205 this.field_94315_d = par1StitchHolder.func_94199_b(); 206 } 207 208 stitchslot = new StitchSlot(this.field_94318_c, 0, par1StitchHolder.func_94197_a(), this.field_94315_d); 209 this.field_94318_c += par1StitchHolder.func_94197_a(); 210 } 211 else 212 { 213 stitchslot = new StitchSlot(0, this.field_94315_d, this.field_94318_c, par1StitchHolder.func_94199_b()); 214 this.field_94315_d += par1StitchHolder.func_94199_b(); 215 } 216 217 stitchslot.func_94182_a(par1StitchHolder); 218 this.field_94317_b.add(stitchslot); 219 return true; 220 } 221}