Portl

Untitled

Oct 27th, 2016
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 32.90 KB | None | 0 0
  1. import java.util.Set;
  2. import java.io.FileNotFoundException;
  3. import java.util.Properties;
  4. import net.minecraft.src.Config;
  5. import java.util.Arrays;
  6. import java.util.Iterator;
  7. import java.util.List;
  8. import net.minecraft.client.renderer.WorldRenderer;
  9. import net.minecraft.client.renderer.Tessellator;
  10. import com.ibm.icu.text.ArabicShapingException;
  11. import com.ibm.icu.text.Bidi;
  12. import com.ibm.icu.text.ArabicShaping;
  13. import net.minecraft.client.renderer.GlStateManager;
  14. import org.lwjgl.opengl.GL11;
  15. import java.io.InputStream;
  16. import org.apache.commons.io.IOUtils;
  17. import java.awt.image.BufferedImage;
  18. import java.io.IOException;
  19. import net.minecraft.client.renderer.texture.TextureUtil;
  20. import me.aristhena.utils.ClientUtils;
  21. import net.minecraft.client.resources.IResourceManager;
  22. import net.minecraft.client.settings.GameSettings;
  23. import net.minecraft.client.renderer.texture.TextureManager;
  24. import java.util.Random;
  25. import net.minecraft.util.ResourceLocation;
  26. import net.minecraft.client.resources.IResourceManagerReloadListener;
  27.  
  28. public class FontRenderer implements IResourceManagerReloadListener
  29. {
  30. private static final ResourceLocation[] unicodePageLocations;
  31. private static float[] charWidth;
  32. public int FONT_HEIGHT;
  33. public Random fontRandom;
  34. private byte[] glyphWidth;
  35. public int[] colorCode;
  36. private static ResourceLocation locationFontTexture;
  37. private final TextureManager renderEngine;
  38. private double posX;
  39. private double posY;
  40. private boolean unicodeFlag;
  41. private boolean bidiFlag;
  42. private float red;
  43. private float blue;
  44. private float green;
  45. private float alpha;
  46. private int textColor;
  47. private boolean randomStyle;
  48. private boolean boldStyle;
  49. private boolean italicStyle;
  50. private boolean underlineStyle;
  51. private boolean strikethroughStyle;
  52. public GameSettings gameSettings;
  53. public ResourceLocation locationFontTextureBase;
  54. public boolean enabled;
  55. public float scaleFactor;
  56.  
  57. static {
  58. unicodePageLocations = new ResourceLocation[256];
  59. }
  60.  
  61. public FontRenderer(final GameSettings p_i1035_1_, final ResourceLocation p_i1035_2_, final TextureManager p_i1035_3_, final boolean p_i1035_4_) {
  62. this.charWidth = new float[256];
  63. this.FONT_HEIGHT = 9;
  64. this.fontRandom = new Random();
  65. this.glyphWidth = new byte[65536];
  66. this.colorCode = new int[32];
  67. this.enabled = true;
  68. this.scaleFactor = 1.0f;
  69. this.gameSettings = p_i1035_1_;
  70. this.locationFontTextureBase = p_i1035_2_;
  71. this.locationFontTexture = p_i1035_2_;
  72. this.renderEngine = p_i1035_3_;
  73. this.unicodeFlag = p_i1035_4_;
  74. p_i1035_3_.bindTexture(this.locationFontTexture);
  75. for (int var5 = 0; var5 < 32; ++var5) {
  76. final int var6 = (var5 >> 3 & 0x1) * 85;
  77. int var7 = (var5 >> 2 & 0x1) * 170 + var6;
  78. int var8 = (var5 >> 1 & 0x1) * 170 + var6;
  79. int var9 = (var5 >> 0 & 0x1) * 170 + var6;
  80. if (var5 == 6) {
  81. var7 += 85;
  82. }
  83. if (p_i1035_1_.anaglyph) {
  84. final int var10 = (var7 * 30 + var8 * 59 + var9 * 11) / 100;
  85. final int var11 = (var7 * 30 + var8 * 70) / 100;
  86. final int var12 = (var7 * 30 + var9 * 70) / 100;
  87. var7 = var10;
  88. var8 = var11;
  89. var9 = var12;
  90. }
  91. if (var5 >= 16) {
  92. var7 /= 4;
  93. var8 /= 4;
  94. var9 /= 4;
  95. }
  96. this.colorCode[var5] = ((var7 & 0xFF) << 16 | (var8 & 0xFF) << 8 | (var9 & 0xFF));
  97. }
  98. this.readGlyphSizes();
  99. }
  100.  
  101. @Override
  102. public void onResourceManagerReload(final IResourceManager resourceManager) {
  103. this.locationFontTexture = getHdFontLocation(this.locationFontTextureBase);
  104. for (int i = 0; i < FontRenderer.unicodePageLocations.length; ++i) {
  105. FontRenderer.unicodePageLocations[i] = null;
  106. }
  107. this.readFontTexture();
  108. }
  109.  
  110. private void readFontTexture() {
  111. BufferedImage bufferedimage;
  112. try {
  113. bufferedimage = TextureUtil.func_177053_a(ClientUtils.mc().getResourceManager().getResource(this.locationFontTexture).getInputStream());
  114. }
  115. catch (IOException var18) {
  116. throw new RuntimeException(var18);
  117. }
  118. final int imgWidth = bufferedimage.getWidth();
  119. final int imgHeight = bufferedimage.getHeight();
  120. final int charW = imgWidth / 16;
  121. final int charH = imgHeight / 16;
  122. final float kx = imgWidth / 128.0f;
  123. this.scaleFactor = kx;
  124. final int[] ai = new int[imgWidth * imgHeight];
  125. bufferedimage.getRGB(0, 0, imgWidth, imgHeight, ai, 0, imgWidth);
  126. for (int k = 0; k < 256; ++k) {
  127. final int cx = k % 16;
  128. final int cy = k / 16;
  129. final boolean px = false;
  130. int var19;
  131. for (var19 = charW - 1; var19 >= 0; --var19) {
  132. final int x = cx * charW + var19;
  133. boolean flag = true;
  134. for (int py = 0; py < charH && flag; ++py) {
  135. final int ypos = (cy * charH + py) * imgWidth;
  136. final int col = ai[x + ypos];
  137. final int al = col >> 24 & 0xFF;
  138. if (al > 16) {
  139. flag = false;
  140. }
  141. }
  142. if (!flag) {
  143. break;
  144. }
  145. }
  146. if (k == 32) {
  147. if (charW <= 8) {
  148. var19 = (int)(2.0f * kx);
  149. }
  150. else {
  151. var19 = (int)(1.5f * kx);
  152. }
  153. }
  154. this.charWidth[k] = (var19 + 1) / kx + 1.0f;
  155. }
  156. this.readCustomCharWidths();
  157. }
  158.  
  159. private void readGlyphSizes() {
  160. InputStream var1 = null;
  161. try {
  162. var1 = ClientUtils.mc().getResourceManager().getResource(new ResourceLocation("font/glyph_sizes.bin")).getInputStream();
  163. var1.read(this.glyphWidth);
  164. }
  165. catch (IOException var2) {
  166. throw new RuntimeException(var2);
  167. }
  168. finally {
  169. IOUtils.closeQuietly(var1);
  170. }
  171. IOUtils.closeQuietly(var1);
  172. }
  173.  
  174. private float renderCharAtPos(final int p_78278_1_, final char p_78278_2_, final boolean p_78278_3_) {
  175. return (p_78278_2_ == ' ') ? this.charWidth[p_78278_2_] : ((p_78278_2_ == ' ') ? 4.0f : (("\u00c0\u00c1\u00c2\u00c8\u00ca\u00cb\u00cd\u00d3\u00d4\u00d5\u00da\u00df\u00e3\u00f5\u011f\u0130\u0131\u0152\u0153\u015e\u015f\u0174\u0175\u017e\u0207\u0000\u0000\u0000\u0000\u0000\u0000\u0000 !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u0000\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u00ec\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00f2\u00fb\u00f9\u00ff\u00d6\u00dc\u00f8£\u00d8\u00d7\u0192\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1ªº¿®¬½¼¡«»\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u03b2\u0393\u03c0\u03a3\u03c3\u03bc\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u2205\u2208\u2229\u2261±\u2265\u2264\u2320\u2321\u00f7\u2248°\u2219·\u221a\u207f²\u25a0\u0000".indexOf(p_78278_2_) != -1 && !this.unicodeFlag) ? this.renderDefaultChar(p_78278_1_, p_78278_3_) : this.renderUnicodeChar(p_78278_2_, p_78278_3_)));
  176. }
  177.  
  178. private float renderDefaultChar(final int p_78266_1_, final boolean p_78266_2_) {
  179. final float var3 = p_78266_1_ % 16 * 8;
  180. final float var4 = p_78266_1_ / 16 * 8;
  181. final float var5 = p_78266_2_ ? 1.0f : 0.0f;
  182. this.renderEngine.bindTexture(this.locationFontTexture);
  183. final float var6 = 7.99f;
  184. GL11.glBegin(5);
  185. GL11.glTexCoord2f(var3 / 128.0f, var4 / 128.0f);
  186. GL11.glVertex3d(this.posX + var5, this.posY, 0.0);
  187. GL11.glTexCoord2f(var3 / 128.0f, (var4 + 7.99f) / 128.0f);
  188. GL11.glVertex3d(this.posX - var5, this.posY + 7.989999771118164, 0.0);
  189. GL11.glTexCoord2f((var3 + var6 - 1.0f) / 128.0f, var4 / 128.0f);
  190. GL11.glVertex3d(this.posX + var6 - 1.0 + var5, this.posY, 0.0);
  191. GL11.glTexCoord2f((var3 + var6 - 1.0f) / 128.0f, (var4 + 7.99f) / 128.0f);
  192. GL11.glVertex3d(this.posX + var6 - 1.0 - var5, this.posY + 7.989999771118164, 0.0);
  193. GL11.glEnd();
  194. return this.charWidth[p_78266_1_];
  195. }
  196.  
  197. private ResourceLocation getUnicodePageLocation(final int p_111271_1_) {
  198. if (FontRenderer.unicodePageLocations[p_111271_1_] == null) {
  199. FontRenderer.unicodePageLocations[p_111271_1_] = new ResourceLocation(String.format("textures/font/unicode_page_%02x.png", p_111271_1_));
  200. FontRenderer.unicodePageLocations[p_111271_1_] = getHdFontLocation(FontRenderer.unicodePageLocations[p_111271_1_]);
  201. }
  202. return FontRenderer.unicodePageLocations[p_111271_1_];
  203. }
  204.  
  205. private void loadGlyphTexture(final int p_78257_1_) {
  206. this.renderEngine.bindTexture(this.getUnicodePageLocation(p_78257_1_));
  207. }
  208.  
  209. private float renderUnicodeChar(final char p_78277_1_, final boolean p_78277_2_) {
  210. if (this.glyphWidth[p_78277_1_] == 0) {
  211. return 0.0f;
  212. }
  213. final int var3 = p_78277_1_ / '\u0100';
  214. this.loadGlyphTexture(var3);
  215. final int var4 = this.glyphWidth[p_78277_1_] >>> 4;
  216. final int var5 = this.glyphWidth[p_78277_1_] & 0xF;
  217. final float var6 = var4;
  218. final float var7 = var5 + 1;
  219. final float var8 = p_78277_1_ % '\u0010' * '\u0010' + var6;
  220. final float var9 = (p_78277_1_ & '\u00ff') / '\u0010' * '\u0010';
  221. final float var10 = var7 - var6 - 0.02f;
  222. final float var11 = p_78277_2_ ? 1.0f : 0.0f;
  223. GL11.glBegin(5);
  224. GL11.glTexCoord2f(var8 / 256.0f, var9 / 256.0f);
  225. GL11.glVertex3d(this.posX + var11, this.posY, 0.0);
  226. GL11.glTexCoord2f(var8 / 256.0f, (var9 + 15.98f) / 256.0f);
  227. GL11.glVertex3d(this.posX - var11, this.posY + 7.989999771118164, 0.0);
  228. GL11.glTexCoord2f((var8 + var10) / 256.0f, var9 / 256.0f);
  229. GL11.glVertex3d(this.posX + var10 / 2.0f + var11, this.posY, 0.0);
  230. GL11.glTexCoord2f((var8 + var10) / 256.0f, (var9 + 15.98f) / 256.0f);
  231. GL11.glVertex3d(this.posX + var10 / 2.0f - var11, this.posY + 7.989999771118164, 0.0);
  232. GL11.glEnd();
  233. return (var7 - var6) / 2.0f + 1.0f;
  234. }
  235.  
  236. public void drawScaledString(final String string, final double x, final double y, final int color, final double scale) {
  237. int strWidth = this.getStringWidth(string);
  238. strWidth *= (int)scale;
  239. double totalX = x - strWidth / 2;
  240. double totalY = y - this.FONT_HEIGHT * scale / 2.0;
  241. totalX /= scale;
  242. totalY /= scale;
  243. GL11.glPushMatrix();
  244. GL11.glScaled(scale, scale, 1.0);
  245. this.drawString(string, totalX, totalY, color);
  246. GL11.glPopMatrix();
  247. }
  248.  
  249. public void drawCenteredString(final String text, final double x, final double y, final int color) {
  250. this.drawStringWithShadow(text, (float)(x - this.getStringWidth(text) / 2), (float)y, color);
  251. }
  252.  
  253. public int drawStringWithShadow(final String p_175063_1_, final double p_175063_2_, final double p_175063_3_, final int p_175063_4_) {
  254. return this.func_175065_a(p_175063_1_, p_175063_2_, p_175063_3_, p_175063_4_, true);
  255. }
  256.  
  257. public int drawString(final String text, final double x, final double y, final int color) {
  258. return this.enabled ? this.func_175065_a(text, x, y, color, false) : 0;
  259. }
  260.  
  261. public int func_175065_a(final String p_175065_1_, final double p_175065_2_, final double p_175065_3_, final int p_175065_4_, final boolean p_175065_5_) {
  262. GlStateManager.enableAlpha();
  263. this.resetStyles();
  264. int var6;
  265. if (p_175065_5_) {
  266. var6 = this.func_180455_b(p_175065_1_, p_175065_2_ + 0.800000011920929, p_175065_3_ + 0.800000011920929, p_175065_4_, true);
  267. var6 = Math.max(var6, this.func_180455_b(p_175065_1_, p_175065_2_, p_175065_3_, p_175065_4_, false));
  268. }
  269. else {
  270. var6 = this.func_180455_b(p_175065_1_, p_175065_2_, p_175065_3_, p_175065_4_, false);
  271. }
  272. return var6;
  273. }
  274.  
  275. private String bidiReorder(final String p_147647_1_) {
  276. try {
  277. final Bidi var3 = new Bidi(new ArabicShaping(8).shape(p_147647_1_), 127);
  278. var3.setReorderingMode(0);
  279. return var3.writeReordered(2);
  280. }
  281. catch (ArabicShapingException var4) {
  282. return p_147647_1_;
  283. }
  284. }
  285.  
  286. private void resetStyles() {
  287. this.randomStyle = false;
  288. this.boldStyle = false;
  289. this.italicStyle = false;
  290. this.underlineStyle = false;
  291. this.strikethroughStyle = false;
  292. }
  293.  
  294. private void renderStringAtPos(final String p_78255_1_, final boolean p_78255_2_) {
  295. for (int var3 = 0; var3 < p_78255_1_.length(); ++var3) {
  296. final char var4 = p_78255_1_.charAt(var3);
  297. if (var4 == '§' && var3 + 1 < p_78255_1_.length()) {
  298. int var5 = "0123456789abcdefklmnor".indexOf(p_78255_1_.toLowerCase().charAt(var3 + 1));
  299. if (var5 < 16) {
  300. this.randomStyle = false;
  301. this.boldStyle = false;
  302. this.strikethroughStyle = false;
  303. this.underlineStyle = false;
  304. this.italicStyle = false;
  305. if (var5 < 0 || var5 > 15) {
  306. var5 = 15;
  307. }
  308. if (p_78255_2_) {
  309. var5 += 16;
  310. }
  311. final int var6 = this.colorCode[var5];
  312. this.textColor = var6;
  313. GlStateManager.color((var6 >> 16) / 255.0f, (var6 >> 8 & 0xFF) / 255.0f, (var6 & 0xFF) / 255.0f, this.alpha);
  314. }
  315. else if (var5 == 16) {
  316. this.randomStyle = true;
  317. }
  318. else if (var5 == 17) {
  319. this.boldStyle = true;
  320. }
  321. else if (var5 == 18) {
  322. this.strikethroughStyle = true;
  323. }
  324. else if (var5 == 19) {
  325. this.underlineStyle = true;
  326. }
  327. else if (var5 == 20) {
  328. this.italicStyle = true;
  329. }
  330. else if (var5 == 21) {
  331. this.randomStyle = false;
  332. this.boldStyle = false;
  333. this.strikethroughStyle = false;
  334. this.underlineStyle = false;
  335. this.italicStyle = false;
  336. GlStateManager.color(this.red, this.blue, this.green, this.alpha);
  337. }
  338. ++var3;
  339. }
  340. else {
  341. int var5 = "\u00c0\u00c1\u00c2\u00c8\u00ca\u00cb\u00cd\u00d3\u00d4\u00d5\u00da\u00df\u00e3\u00f5\u011f\u0130\u0131\u0152\u0153\u015e\u015f\u0174\u0175\u017e\u0207\u0000\u0000\u0000\u0000\u0000\u0000\u0000 !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u0000\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u00ec\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00f2\u00fb\u00f9\u00ff\u00d6\u00dc\u00f8£\u00d8\u00d7\u0192\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1ªº¿®¬½¼¡«»\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u03b2\u0393\u03c0\u03a3\u03c3\u03bc\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u2205\u2208\u2229\u2261±\u2265\u2264\u2320\u2321\u00f7\u2248°\u2219·\u221a\u207f²\u25a0\u0000".indexOf(var4);
  342. if (this.randomStyle && var5 != -1) {
  343. int var6;
  344. do {
  345. var6 = this.fontRandom.nextInt(this.charWidth.length);
  346. } while ((int)this.charWidth[var5] != (int)this.charWidth[var6]);
  347. var5 = var6;
  348. }
  349. final float var7 = this.unicodeFlag ? 0.5f : (1.0f / this.scaleFactor);
  350. final boolean var8 = (var4 == '\0' || var5 == -1 || this.unicodeFlag) && p_78255_2_;
  351. if (var8) {
  352. this.posX -= var7;
  353. this.posY -= var7;
  354. }
  355. float var9 = this.renderCharAtPos(var5, var4, this.italicStyle);
  356. if (var8) {
  357. this.posX += var7;
  358. this.posY += var7;
  359. }
  360. if (this.boldStyle) {
  361. this.posX += var7;
  362. if (var8) {
  363. this.posX -= var7;
  364. this.posY -= var7;
  365. }
  366. this.renderCharAtPos(var5, var4, this.italicStyle);
  367. this.posX -= var7;
  368. if (var8) {
  369. this.posX += var7;
  370. this.posY += var7;
  371. }
  372. var9 += var7;
  373. }
  374. if (this.strikethroughStyle) {
  375. final Tessellator var10 = Tessellator.getInstance();
  376. final WorldRenderer var11 = var10.getWorldRenderer();
  377. GlStateManager.disableTexture2D();
  378. var11.startDrawingQuads();
  379. var11.addVertex(this.posX, this.posY + this.FONT_HEIGHT / 2, 0.0);
  380. var11.addVertex(this.posX + var9, this.posY + this.FONT_HEIGHT / 2, 0.0);
  381. var11.addVertex(this.posX + var9, this.posY + this.FONT_HEIGHT / 2 - 1.0, 0.0);
  382. var11.addVertex(this.posX, this.posY + this.FONT_HEIGHT / 2 - 1.0, 0.0);
  383. var10.draw();
  384. GlStateManager.enableTexture2D();
  385. }
  386. if (this.underlineStyle) {
  387. final Tessellator var10 = Tessellator.getInstance();
  388. final WorldRenderer var11 = var10.getWorldRenderer();
  389. GlStateManager.disableTexture2D();
  390. var11.startDrawingQuads();
  391. final int var12 = this.underlineStyle ? -1 : 0;
  392. var11.addVertex(this.posX + var12, this.posY + this.FONT_HEIGHT, 0.0);
  393. var11.addVertex(this.posX + var9, this.posY + this.FONT_HEIGHT, 0.0);
  394. var11.addVertex(this.posX + var9, this.posY + this.FONT_HEIGHT - 1.0, 0.0);
  395. var11.addVertex(this.posX + var12, this.posY + this.FONT_HEIGHT - 1.0, 0.0);
  396. var10.draw();
  397. GlStateManager.enableTexture2D();
  398. }
  399. this.posX += var9;
  400. }
  401. }
  402. }
  403.  
  404. private int renderStringAligned(final String p_78274_1_, int p_78274_2_, final int p_78274_3_, final int p_78274_4_, final int p_78274_5_, final boolean p_78274_6_) {
  405. if (this.bidiFlag) {
  406. final int var7 = this.getStringWidth(this.bidiReorder(p_78274_1_));
  407. p_78274_2_ = p_78274_2_ + p_78274_4_ - var7;
  408. }
  409. return this.func_180455_b(p_78274_1_, p_78274_2_, p_78274_3_, p_78274_5_, p_78274_6_);
  410. }
  411.  
  412. private int func_180455_b(String p_180455_1_, final double p_180455_2_, final double p_180455_3_, int p_180455_4_, final boolean p_180455_5_) {
  413. if (p_180455_1_ == null) {
  414. return 0;
  415. }
  416. if (this.bidiFlag) {
  417. p_180455_1_ = this.bidiReorder(p_180455_1_);
  418. }
  419. if ((p_180455_4_ & 0xFC000000) == 0x0) {
  420. p_180455_4_ |= 0xFF000000;
  421. }
  422. if (p_180455_5_) {
  423. p_180455_4_ = ((p_180455_4_ & 0xFCFCFC) >> 2 | (p_180455_4_ & 0xFF000000));
  424. }
  425. this.red = (p_180455_4_ >> 16 & 0xFF) / 255.0f;
  426. this.blue = (p_180455_4_ >> 8 & 0xFF) / 255.0f;
  427. this.green = (p_180455_4_ & 0xFF) / 255.0f;
  428. this.alpha = (p_180455_4_ >> 24 & 0xFF) / 255.0f;
  429. GlStateManager.color(this.red, this.blue, this.green, this.alpha);
  430. this.posX = p_180455_2_;
  431. this.posY = p_180455_3_;
  432. this.renderStringAtPos(p_180455_1_, p_180455_5_);
  433. return (int)this.posX;
  434. }
  435.  
  436. public int getStringWidth(final String p_78256_1_) {
  437. if (p_78256_1_ == null) {
  438. return 0;
  439. }
  440. float var2 = 0.0f;
  441. boolean var3 = false;
  442. for (int var4 = 0; var4 < p_78256_1_.length(); ++var4) {
  443. char var5 = p_78256_1_.charAt(var4);
  444. float var6 = this.getCharWidthFloat(var5);
  445. if (var6 < 0.0f && var4 < p_78256_1_.length() - 1) {
  446. ++var4;
  447. var5 = p_78256_1_.charAt(var4);
  448. if (var5 != 'l' && var5 != 'L') {
  449. if (var5 == 'r' || var5 == 'R') {
  450. var3 = false;
  451. }
  452. }
  453. else {
  454. var3 = true;
  455. }
  456. var6 = 0.0f;
  457. }
  458. var2 += var6;
  459. if (var3 && var6 > 0.0f) {
  460. ++var2;
  461. }
  462. }
  463. return (int)var2;
  464. }
  465.  
  466. public int getCharWidth(final char par1) {
  467. return Math.round(this.getCharWidthFloat(par1));
  468. }
  469.  
  470. private float getCharWidthFloat(final char p_78263_1_) {
  471. if (p_78263_1_ == '§') {
  472. return -1.0f;
  473. }
  474. if (p_78263_1_ == ' ') {
  475. return this.charWidth[32];
  476. }
  477. final int var2 = "\u00c0\u00c1\u00c2\u00c8\u00ca\u00cb\u00cd\u00d3\u00d4\u00d5\u00da\u00df\u00e3\u00f5\u011f\u0130\u0131\u0152\u0153\u015e\u015f\u0174\u0175\u017e\u0207\u0000\u0000\u0000\u0000\u0000\u0000\u0000 !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u0000\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u00ec\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00f2\u00fb\u00f9\u00ff\u00d6\u00dc\u00f8£\u00d8\u00d7\u0192\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1ªº¿®¬½¼¡«»\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u03b2\u0393\u03c0\u03a3\u03c3\u03bc\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u2205\u2208\u2229\u2261±\u2265\u2264\u2320\u2321\u00f7\u2248°\u2219·\u221a\u207f²\u25a0\u0000".indexOf(p_78263_1_);
  478. if (p_78263_1_ > '\0' && var2 != -1 && !this.unicodeFlag) {
  479. return this.charWidth[var2];
  480. }
  481. if (this.glyphWidth[p_78263_1_] != 0) {
  482. int var3 = this.glyphWidth[p_78263_1_] >>> 4;
  483. int var4 = this.glyphWidth[p_78263_1_] & 0xF;
  484. if (var4 > 7) {
  485. var4 = 15;
  486. var3 = 0;
  487. }
  488. return (++var4 - var3) / 2 + 1;
  489. }
  490. return 0.0f;
  491. }
  492.  
  493. public String trimStringToWidth(final String p_78269_1_, final int p_78269_2_) {
  494. return this.trimStringToWidth(p_78269_1_, p_78269_2_, false);
  495. }
  496.  
  497. public String trimStringToWidth(final String p_78262_1_, final int p_78262_2_, final boolean p_78262_3_) {
  498. final StringBuilder var4 = new StringBuilder();
  499. float var5 = 0.0f;
  500. final int var6 = p_78262_3_ ? (p_78262_1_.length() - 1) : 0;
  501. final int var7 = p_78262_3_ ? -1 : 1;
  502. boolean var8 = false;
  503. boolean var9 = false;
  504. for (int var10 = var6; var10 >= 0 && var10 < p_78262_1_.length() && var5 < p_78262_2_; var10 += var7) {
  505. final char var11 = p_78262_1_.charAt(var10);
  506. final float var12 = this.getCharWidthFloat(var11);
  507. if (var8) {
  508. var8 = false;
  509. if (var11 != 'l' && var11 != 'L') {
  510. if (var11 == 'r' || var11 == 'R') {
  511. var9 = false;
  512. }
  513. }
  514. else {
  515. var9 = true;
  516. }
  517. }
  518. else if (var12 < 0.0f) {
  519. var8 = true;
  520. }
  521. else {
  522. var5 += var12;
  523. if (var9) {
  524. ++var5;
  525. }
  526. }
  527. if (var5 > p_78262_2_) {
  528. break;
  529. }
  530. if (p_78262_3_) {
  531. var4.insert(0, var11);
  532. }
  533. else {
  534. var4.append(var11);
  535. }
  536. }
  537. return var4.toString();
  538. }
  539.  
  540. private String trimStringNewline(String p_78273_1_) {
  541. while (p_78273_1_ != null && p_78273_1_.endsWith("\n")) {
  542. p_78273_1_ = p_78273_1_.substring(0, p_78273_1_.length() - 1);
  543. }
  544. return p_78273_1_;
  545. }
  546.  
  547. public void drawSplitString(String str, final int x, final int y, final int wrapWidth, final int textColor) {
  548. this.resetStyles();
  549. this.textColor = textColor;
  550. str = this.trimStringNewline(str);
  551. this.renderSplitString(str, x, y, wrapWidth, false);
  552. }
  553.  
  554. private void renderSplitString(final String str, final int x, int y, final int wrapWidth, final boolean addShadow) {
  555. final List var6 = this.listFormattedStringToWidth(str, wrapWidth);
  556. for (Iterator var7 = var6.iterator(); var7.hasNext(); y += FONT_HEIGHT)
  557. {
  558. String var8 = (String)var7.next();
  559. this.renderStringAligned(var8, x, y, wrapWidth, this.textColor, addShadow);
  560. y += this.FONT_HEIGHT;
  561. }
  562. }
  563.  
  564. public int splitStringWidth(final String p_78267_1_, final int p_78267_2_) {
  565. return this.FONT_HEIGHT * this.listFormattedStringToWidth(p_78267_1_, p_78267_2_).size();
  566. }
  567.  
  568. public void setUnicodeFlag(final boolean p_78264_1_) {
  569. this.unicodeFlag = p_78264_1_;
  570. }
  571.  
  572. public boolean getUnicodeFlag() {
  573. return this.unicodeFlag;
  574. }
  575.  
  576. public void setBidiFlag(final boolean p_78275_1_) {
  577. this.bidiFlag = p_78275_1_;
  578. }
  579.  
  580. public List listFormattedStringToWidth(final String str, final int wrapWidth) {
  581. return Arrays.asList(this.wrapFormattedStringToWidth(str, wrapWidth).split("\n"));
  582. }
  583.  
  584. protected String wrapFormattedStringToWidth(final String str, final int wrapWidth) {
  585. final int var3 = this.sizeStringToWidth(str, wrapWidth);
  586. if (str.length() <= var3) {
  587. return str;
  588. }
  589. final String var4 = str.substring(0, var3);
  590. final char var5 = str.charAt(var3);
  591. final boolean var6 = var5 == ' ' || var5 == '\n';
  592. final String var7 = String.valueOf(getFormatFromString(var4)) + str.substring(var3 + (var6 ? 1 : 0));
  593. return String.valueOf(var4) + "\n" + this.wrapFormattedStringToWidth(var7, wrapWidth);
  594. }
  595.  
  596. private int sizeStringToWidth(final String str, final int wrapWidth) {
  597. final int var3 = str.length();
  598. float var4 = 0.0f;
  599. int var5 = 0;
  600. int var6 = -1;
  601. boolean var7 = false;
  602. while (var5 < var3) {
  603. final char var8 = str.charAt(var5);
  604. Label_0163: {
  605. switch (var8) {
  606. case '\n': {
  607. --var5;
  608. break Label_0163;
  609. }
  610. case '§': {
  611. if (var5 >= var3 - 1) {
  612. break Label_0163;
  613. }
  614. ++var5;
  615. final char var9 = str.charAt(var5);
  616. if (var9 == 'l' || var9 == 'L') {
  617. var7 = true;
  618. break Label_0163;
  619. }
  620. if (var9 == 'r' || var9 == 'R' || isFormatColor(var9)) {
  621. var7 = false;
  622. }
  623. break Label_0163;
  624. }
  625. case ' ': {
  626. var6 = var5;
  627. break;
  628. }
  629. }
  630. var4 += this.getCharWidthFloat(var8);
  631. if (var7) {
  632. ++var4;
  633. }
  634. }
  635. if (var8 == '\n') {
  636. var6 = ++var5;
  637. break;
  638. }
  639. if (var4 > wrapWidth) {
  640. break;
  641. }
  642. ++var5;
  643. }
  644. return (var5 != var3 && var6 != -1 && var6 < var5) ? var6 : var5;
  645. }
  646.  
  647. private static boolean isFormatColor(final char colorChar) {
  648. return (colorChar >= '0' && colorChar <= '9') || (colorChar >= 'a' && colorChar <= 'f') || (colorChar >= 'A' && colorChar <= 'F');
  649. }
  650.  
  651. private static boolean isFormatSpecial(final char formatChar) {
  652. return (formatChar >= 'k' && formatChar <= 'o') || (formatChar >= 'K' && formatChar <= 'O') || formatChar == 'r' || formatChar == 'R';
  653. }
  654.  
  655. public static String getFormatFromString(final String p_78282_0_) {
  656. String var1 = "";
  657. int var2 = -1;
  658. final int var3 = p_78282_0_.length();
  659. while ((var2 = p_78282_0_.indexOf(167, var2 + 1)) != -1) {
  660. if (var2 < var3 - 1) {
  661. final char var4 = p_78282_0_.charAt(var2 + 1);
  662. if (isFormatColor(var4)) {
  663. var1 = "§" + var4;
  664. }
  665. else {
  666. if (!isFormatSpecial(var4)) {
  667. continue;
  668. }
  669. var1 = String.valueOf(var1) + "§" + var4;
  670. }
  671. }
  672. }
  673. return var1;
  674. }
  675.  
  676. public boolean getBidiFlag() {
  677. return this.bidiFlag;
  678. }
  679.  
  680. public int func_175064_b(final char p_175064_1_) {
  681. final int index = "0123456789abcdef".indexOf(p_175064_1_);
  682. return (index >= 0 && index < this.colorCode.length) ? this.colorCode[index] : 16777215;
  683. }
  684.  
  685. private static void readCustomCharWidths()
  686. {
  687. String fontFileName = locationFontTexture.getResourcePath();
  688. String suffix = ".png";
  689. if (fontFileName.endsWith(suffix))
  690. {
  691. String fileName = fontFileName.substring(0, fontFileName.length() - suffix.length()) + ".properties";
  692. try
  693. {
  694. ResourceLocation e = new ResourceLocation(locationFontTexture.getResourceDomain(), fileName);
  695. InputStream in = Config.getResourceStream(Config.getResourceManager(), e);
  696. if (in == null) {
  697. return;
  698. }
  699. Config.log("Loading " + fileName);
  700. Properties props = new Properties();
  701. props.load(in);
  702. Set keySet = props.keySet();
  703. Iterator iter = keySet.iterator();
  704. while (iter.hasNext())
  705. {
  706. String key = (String)iter.next();
  707. String prefix = "width.";
  708. if (key.startsWith(prefix))
  709. {
  710. String numStr = key.substring(prefix.length());
  711. int num = Config.parseInt(numStr, -1);
  712. if ((num >= 0) && (num < charWidth.length))
  713. {
  714. String value = props.getProperty(key);
  715. float width = Config.parseFloat(value, -1.0F);
  716. if (width >= 0.0F) {
  717. charWidth[num] = width;
  718. }
  719. }
  720. }
  721. }
  722. }
  723. catch (FileNotFoundException localFileNotFoundException) {}catch (IOException var16)
  724. {
  725. var16.printStackTrace();
  726. }
  727. }
  728. }
  729.  
  730.  
  731. private static ResourceLocation getHdFontLocation(final ResourceLocation fontLoc) {
  732. String fontName = fontLoc.getResourcePath();
  733. final String texturesStr = "textures/";
  734. final String mcpatcherStr = "client/";
  735. if (!fontName.startsWith(texturesStr)) {
  736. return fontLoc;
  737. }
  738. fontName = fontName.substring(texturesStr.length());
  739. fontName = String.valueOf(mcpatcherStr) + fontName;
  740. final ResourceLocation fontLocHD = new ResourceLocation(fontLoc.getResourceDomain(), fontName);
  741. return Config.hasResource(Config.getResourceManager(), fontLocHD) ? fontLocHD : fontLoc;
  742. }
  743. }
Add Comment
Please, Sign In to add comment