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