🏡 index : ~doyle/mcinject.git

package io.github.jordandoyle.mcinject.gui;

import static org.lwjgl.opengl.GL11.*;
import io.github.jordandoyle.mcinject.Main;

import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.RenderingHints;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.regex.Pattern;

import org.lwjgl.opengl.GL11;
import org.newdawn.slick.TrueTypeFont;
import org.newdawn.slick.UnicodeFont;
import org.newdawn.slick.font.GlyphPage;
import org.newdawn.slick.font.effects.ColorEffect;

import com.google.common.io.Resources;

public class FontRenderer {
	private Pattern patternControlCode = Pattern.compile("(?i)\\u00A7[0-9A-FK-OR]");

	public FontRenderer() {
		URL fontUrl = null;
		try {
			fontUrl = new File(Main.minecraft, "mcinject/font.ttf").toURI().toURL();
		} catch (MalformedURLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

		Font font = null;
		try {
			font = Font.createFont(Font.TRUETYPE_FONT,
					fontUrl.openStream());
		} catch (Exception e) {
			e.printStackTrace();
		}

		this.unicodeFont = new UnicodeFont(font.deriveFont(27F));

		try {
			this.unicodeFont.addAsciiGlyphs();
			this.unicodeFont.getEffects().add(
					new ColorEffect(java.awt.Color.WHITE));
			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;
		}
	}

	private final UnicodeFont unicodeFont;
	private final int[] colorCodes = new int[32];

	public void drawString(String text, float x, float y, int color) {
		x *= 2.0F;
		y *= 2.0F;
		float originalX = x;

		glPushMatrix();
		glScaled(0.5, 0.5, 0.5);
		glEnable(GL_BLEND);
		glDisable(GL_TEXTURE_2D);
		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

		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 = "0123456789abcdef".indexOf(text
						.charAt(index + 1));
				if (codeIndex < 0)
					continue;
				int col = this.colorCodes[codeIndex];
				currentColor = col;
			}

			index++;
		}

		glEnable(GL_TEXTURE_2D);
		glDisable(GL_BLEND);
		glPopMatrix();
	}

	public void drawStringWithShadow(String text, float x, float y, int color) {
		drawString(stripControlCodes(text), x + 0.5F, y + 0.75F,
				0x55000000);
		drawString(text, x, y, color);
	}

	public void drawCenteredString(String text, float x, float y, int color) {
		drawString(text, x / 2.0F - getWidth(text) / 2.0F, y, color);
	}

	public void drawCenteredStringWithShadow(String text, float x, float y,
			int color) {
		drawCenteredString(stripControlCodes(text), x + 0.5F,
				y + 0.5F, color);
		drawCenteredString(text, x, y, color);
	}

	public float getWidth(String s) {
		float width = 0.0F;

		String s1 = s;
		for (char c : s1.toCharArray()) {
			width += unicodeFont.getWidth(Character.toString(c));
		}

		return width / 2.0F;
	}

	public float getHeight(String s) {
		return unicodeFont.getHeight(s) / 2.0F;
	}

	public UnicodeFont getFont() {
		return this.unicodeFont;
	}

	private String stripControlCodes(String par0Str)
    {
        return patternControlCode.matcher(par0Str).replaceAll("");
    }
}