package me.lordethan.cryton.ttf; import static org.lwjgl.opengl.GL11.GL_BLEND; import static org.lwjgl.opengl.GL11.GL_LIGHTING; import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D; import static org.lwjgl.opengl.GL11.glDisable; import static org.lwjgl.opengl.GL11.glEnable; import static org.lwjgl.opengl.GL11.glIsEnabled; import static org.lwjgl.opengl.GL11.glPopMatrix; import static org.lwjgl.opengl.GL11.glPushMatrix; import org.lwjgl.opengl.GL11; import java.awt.Font; import net.minecraft.client.Minecraft; import net.minecraft.util.StringUtils; import org.lwjgl.opengl.GL11; import org.newdawn.slick.UnicodeFont; import org.newdawn.slick.font.effects.ColorEffect; public class FontUtils { private Minecraft mc = Minecraft.getMinecraft(); private final UnicodeFont unicodeFont; private final int[] colorCodes = new int[32]; private int fontType, size; private String fontName; private float kerning; public FontUtils(String fontName, int fontType, int size) { this(fontName, fontType, size, 0); } public FontUtils(String fontName, int fontType, int size, float kerning) { this.fontName = fontName; this.fontType = fontType; this.size = size; this.unicodeFont = new UnicodeFont(new Font(fontName, fontType, size)); this.kerning = kerning; this.unicodeFont.addAsciiGlyphs(); this.unicodeFont.getEffects().add(new ColorEffect(java.awt.Color.WHITE)); try { this.unicodeFont.loadGlyphs(); } catch(Exception e) { e.printStackTrace(); } for(int i = 0; i < 32; i++) { int shadow = (i >> 3 & 1) * 85; int red = (i >> 2 & 1) * 170 + shadow; int green = (i >> 1 & 1) * 170 + shadow; int blue = (i >> 0 & 1) * 170 + shadow; if(i == 6) { red += 85; } if(i >= 16) { red /= 4; green /= 4; blue /= 4; } this.colorCodes[i] = (red & 255) << 16 | (green & 255) << 8 | blue & 255; } } public int drawString(String text, float x, float y, int color) { x *= 2.0F; y *= 2.0F; float originalX = x; GL11.glPushMatrix(); GL11.glScaled(0.5F, 0.5F, 0.5F); boolean blend = GL11.glIsEnabled(GL11.GL_BLEND); boolean lighting = GL11.glIsEnabled(GL11.GL_LIGHTING); boolean texture = GL11.glIsEnabled(GL11.GL_TEXTURE_2D); if(!blend) glEnable(GL11.GL_BLEND); if(lighting) glDisable(GL11.GL_LIGHTING); if(texture) glDisable(GL11.GL_TEXTURE_2D); int currentColor = color; char[] characters = text.toCharArray(); int index = 0; for(char c : characters) { if(c == '\r') { x = originalX; } if(c == '\n') { y += getHeight(Character.toString(c)) * 2.0F; } if(c != '\247' && (index == 0 || index == characters.length - 1 || characters[index - 1] != '\247')) { unicodeFont.drawString(x, y, Character.toString(c), new org.newdawn.slick.Color(currentColor)); x += (getWidth(Character.toString(c)) * 2.0F); } else if(c == ' ') { x += unicodeFont.getSpaceWidth(); } else if(c == '\247' && index != characters.length - 1) { int codeIndex = "0123456789abcdefg".indexOf(text.charAt(index + 1)); if(codeIndex < 0) continue; int col = this.colorCodes[codeIndex]; currentColor = col; } index++; } GL11.glScaled(2.0F, 2.0F, 2.0F); if(texture) GL11.glEnable(GL11.GL_TEXTURE_2D); if(lighting) GL11.glEnable(GL11.GL_LIGHTING); if(!blend) GL11.glDisable(GL11.GL_BLEND); glPopMatrix(); return (int) x; } public int drawStringWithShadow(String text, float x, float y, int color) { drawString(StringUtils.stripControlCodes(text), x + 0.5F, y + 0.5F, 0x000000); return drawString(text, x, y, color); } public void drawCenteredString(String text, float x, float y, int color) { drawString(text, x - (int)getWidth(text) / 2, y, color); } public void drawCenteredStringWithShadow(String text, float x, float y, int color) { drawCenteredString(StringUtils.stripControlCodes(text), x+0.5F, y+0.5F, color); drawCenteredString(text, x, y, color); } public float getWidth(String s) { float width = 0.0F; String str = StringUtils.stripControlCodes(s); for(char c : str.toCharArray()) { width += unicodeFont.getWidth(Character.toString(c)) + this.kerning; } return width / 2.0F; } public float getCharWidth(char c){ return unicodeFont.getWidth(String.valueOf(c)); } public float getHeight(String s) { return unicodeFont.getHeight(s) / 2.0F; } public UnicodeFont getFont() { return this.unicodeFont; } public String trimStringToWidth(String par1Str, int par2) { StringBuilder var4 = new StringBuilder(); float var5 = 0.0F; int var6 = 0; int var7 = 1; boolean var8 = false; boolean var9 = false; for (int var10 = var6; var10 >= 0 && var10 < par1Str.length() && var5 < (float)par2; var10 += var7) { char var11 = par1Str.charAt(var10); float var12 = this.getCharWidth(var11); if (var8) { var8 = false; if (var11 != 108 && var11 != 76) { if (var11 == 114 || var11 == 82) { var9 = false; } } else { var9 = true; } } else if (var12 < 0.0F) { var8 = true; } else { var5 += var12; if (var9) { ++var5; } } if (var5 > (float)par2) { break; } else { var4.append(var11); } } return var4.toString(); } }