Newer
Older
ultramine_bukkit / src / main / java / org / bukkit / map / MapFont.java
@vlad20012 vlad20012 on 24 Feb 2017 3 KB initial
package org.bukkit.map;

import java.util.HashMap;

/**
 * Represents a bitmap font drawable to a map.
 */
public class MapFont
{

	private final HashMap<Character, CharacterSprite> chars = new HashMap<Character, CharacterSprite>();
	private int height = 0;
	protected boolean malleable = true;

	/**
	 * Set the sprite for a given character.
	 *
	 * @param ch     The character to set the sprite for.
	 * @param sprite The CharacterSprite to set.
	 * @throws IllegalStateException if this font is static.
	 */
	public void setChar(char ch, CharacterSprite sprite)
	{
		if(!malleable)
		{
			throw new IllegalStateException("this font is not malleable");
		}

		chars.put(ch, sprite);
		if(sprite.getHeight() > height)
		{
			height = sprite.getHeight();
		}
	}

	/**
	 * Get the sprite for a given character.
	 *
	 * @param ch The character to get the sprite for.
	 * @return The CharacterSprite associated with the character, or null if
	 * there is none.
	 */
	public CharacterSprite getChar(char ch)
	{
		return chars.get(ch);
	}

	/**
	 * Get the width of the given text as it would be rendered using this
	 * font.
	 *
	 * @param text The text.
	 * @return The width in pixels.
	 */
	public int getWidth(String text)
	{
		if(!isValid(text))
		{
			throw new IllegalArgumentException("text contains invalid characters");
		}

		if(text.length() == 0)
		{
			return 0;
		}

		int result = 0;
		for(int i = 0; i < text.length(); ++i)
		{
			result += chars.get(text.charAt(i)).getWidth();
		}
		result += text.length() - 1; // Account for 1px spacing between characters

		return result;
	}

	/**
	 * Get the height of this font.
	 *
	 * @return The height of the font.
	 */
	public int getHeight()
	{
		return height;
	}

	/**
	 * Check whether the given text is valid.
	 *
	 * @param text The text.
	 * @return True if the string contains only defined characters, false
	 * otherwise.
	 */
	public boolean isValid(String text)
	{
		for(int i = 0; i < text.length(); ++i)
		{
			char ch = text.charAt(i);
			if(ch == '\u00A7' || ch == '\n') continue;
			if(chars.get(ch) == null) return false;
		}
		return true;
	}

	/**
	 * Represents the graphics for a single character in a MapFont.
	 */
	public static class CharacterSprite
	{

		private final int width;
		private final int height;
		private final boolean[] data;

		public CharacterSprite(int width, int height, boolean[] data)
		{
			this.width = width;
			this.height = height;
			this.data = data;

			if(data.length != width * height)
			{
				throw new IllegalArgumentException("size of data does not match dimensions");
			}
		}

		/**
		 * Get the value of a pixel of the character.
		 *
		 * @param row The row, in the range [0,8).
		 * @param col The column, in the range [0,8).
		 * @return True if the pixel is solid, false if transparent.
		 */
		public boolean get(int row, int col)
		{
			if(row < 0 || col < 0 || row >= height || col >= width) return false;
			return data[row * width + col];
		}

		/**
		 * Get the width of the character sprite.
		 *
		 * @return The width of the character.
		 */
		public int getWidth()
		{
			return width;
		}

		/**
		 * Get the height of the character sprite.
		 *
		 * @return The height of the character.
		 */
		public int getHeight()
		{
			return height;
		}

	}

}