package org.ripple.power.ui.graphics;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import org.ripple.power.ui.UIRes;
public class LFont {
private static LFont defaultFont = LFont.getFont("Dialog", 0, 20);
public static final int STYLE_PLAIN = 0;
public static final int STYLE_BOLD = 1;
public static final int STYLE_ITALIC = 2;
public static final int STYLE_UNDERLINED = 4;
public static final int SIZE_SMALL = 8;
public static final int SIZE_MEDIUM = 0;
public static final int SIZE_LARGE = 16;
public static final int FACE_MONOSPACE = 32;
public static final int FACE_PROPORTIONAL = 64;
public static final int FACE_SYSTEM = 0;
public static final int FONT_STATIC_TEXT = 0;
public static final int FONT_INPUT_TEXT = 1;
private final static Graphics2D g2d = (Graphics2D) new BufferedImage(1, 1,
BufferedImage.TYPE_INT_ARGB).getGraphics();
private String name;
private int style;
private int size;
private boolean antialiasing;
private boolean initialized;
private FontMetrics fontMetrics;
final private static HashMap<String, LFont> fonts = new HashMap<String, LFont>(
10);
public static LFont getAssetsFont(String file, int style, int size) {
try {
String name = "assets" + (file + style + size).toLowerCase();
LFont o = fonts.get(name);
if (o == null) {
o = new LFont();
o.name = file;
o.style = style;
o.size = size;
o.antialiasing = true;
if (o.antialiasing) {
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
} else {
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
}
Font trueFont = Font.createFont(0, UIRes.getStream(file));
Font baseFont = trueFont.deriveFont(style, size);
o.fontMetrics = g2d.getFontMetrics(baseFont);
o.initialized = true;
fonts.put(name, o);
}
return o;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static LFont getFileFont(String file, int style, int size) {
try {
String name = "file" + (file + style + size).toLowerCase();
LFont o = fonts.get(name);
if (o == null) {
o = new LFont();
o.name = file;
o.style = style;
o.size = size;
o.antialiasing = true;
if (o.antialiasing) {
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
} else {
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
}
Font trueFont = Font.createFont(0, UIRes.getStream(file));
Font baseFont = trueFont.deriveFont(style, size);
o.fontMetrics = g2d.getFontMetrics(baseFont);
o.initialized = true;
fonts.put(name, o);
}
return o;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static LFont getFont(int size) {
return LFont.getFont("Dialog", 0, size);
}
public static LFont getFont(String familyName, int size) {
return getFont(familyName, 0, size);
}
public LFont(int face, int style, int size) {
this.style = style;
this.size = size;
switch (face) {
case FACE_SYSTEM:
this.name = "system";
break;
case FACE_PROPORTIONAL:
this.name = "proportional";
break;
case FACE_MONOSPACE:
this.name = "monospace";
break;
default:
throw new IllegalArgumentException();
}
}
LFont() {
}
public LFont(Font font) {
this.name = font.getFontName();
this.style = font.getStyle();
this.size = font.getSize();
this.antialiasing = true;
this.initialized = false;
}
public LFont(String name, int style, int size, boolean antialiasing) {
this.name = name;
this.style = style;
this.size = size;
this.antialiasing = antialiasing;
this.initialized = false;
}
public LFont(String name, int style, int size) {
this(name, style, size, false);
}
public void setAntialiasing(boolean antialiasing) {
if (this.antialiasing != antialiasing) {
this.antialiasing = antialiasing;
initialized = false;
}
}
public String getFontName() {
return this.name;
}
public int charWidth(char ch) {
checkInitialized();
return fontMetrics.charWidth(ch);
}
public int charsWidth(char[] ch, int offset, int length) {
checkInitialized();
return fontMetrics.charsWidth(ch, offset, length);
}
public int getBaselinePosition() {
checkInitialized();
return fontMetrics.getAscent();
}
public int getLineHeight() {
return getAscent() + getDescent();
}
public int getHeight() {
checkInitialized();
return fontMetrics.getHeight();
}
public int getDescent() {
checkInitialized();
return fontMetrics.getDescent();
}
public int stringWidth(String str) {
checkInitialized();
return fontMetrics.stringWidth(str);
}
public int subStringWidth(String str, int offset, int count) {
checkInitialized();
return fontMetrics.stringWidth(str.substring(offset, offset + count));
}
public static LFont getDefaultFont() {
return defaultFont;
}
public static void setDefaultFont(LFont font) {
defaultFont = font;
}
public static LFont getFont(int face, int style, int size) {
return new LFont(face, style, size);
}
public static LFont getFont(String name, int style, int size) {
return new LFont(name, style, size);
}
public Font getFont() {
checkInitialized();
return fontMetrics.getFont();
}
public int getSize() {
return size;
}
public int getStyle() {
return style;
}
public boolean isBold() {
return (style & STYLE_BOLD) != 0;
}
public boolean isUnderlined() {
return (style & STYLE_UNDERLINED) != 0;
}
public boolean isItalic() {
return (style & STYLE_ITALIC) != 0;
}
public boolean isPlain() {
return style == 0;
}
public int getAscent() {
checkInitialized();
return fontMetrics.getAscent();
}
private synchronized void checkInitialized() {
if (!initialized) {
if (antialiasing) {
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
} else {
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
}
fontMetrics = g2d.getFontMetrics(new Font(name, style, size));
initialized = true;
}
}
}