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;
}
}
}