package org.bootstrap.style;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.Transparency;
import java.awt.font.LineMetrics;
import java.awt.image.BufferedImage;
import javax.swing.Icon;
public class FontStyleIcon implements Icon {
private FontStyle.Icon icon;
private int iconSize;
private Color color;
private Font font;
private BufferedImage imageBuffer = null;
private int iconWidth;
private int iconHeight;
private int iconBaseline;
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
paintImageBuffer();
}
public FontStyle.Icon getIcon() {
return icon;
}
public void setIcon(FontStyle.Icon icon) {
this.icon = icon;
}
public int getIconSize() {
return iconSize;
}
public void setIconSize(int iconSize) {
this.iconSize = iconSize;
}
public Image getImage() {
return imageBuffer;
}
public FontStyleIcon(FontStyle.Icon icon, int iconSize) {
this(icon, iconSize, Color.white);
}
public FontStyleIcon(FontStyle.Icon icon, int iconSize, Color color) {
this.icon = icon;
this.iconSize = iconSize;
this.color = color;
this.font = FontStyle.getInstance().getFont()
.deriveFont(Font.PLAIN, iconSize);
calcImageBufferSize();
paintImageBuffer();
}
public int getIconWidth() {
return iconWidth;
}
public int getIconHeight() {
return iconHeight;
}
public void paintIcon(Component c, Graphics g, int x, int y) {
if (icon == null || imageBuffer == null) {
return;
}
g.drawImage(imageBuffer, x, y, null);
}
private void calcImageBufferSize() {
GraphicsConfiguration config = GraphicsEnvironment
.getLocalGraphicsEnvironment().getDefaultScreenDevice()
.getDefaultConfiguration();
BufferedImage buff = config.createCompatibleImage(1, 1,
Transparency.TRANSLUCENT);
Graphics2D g2 = buff.createGraphics();
g2.setFont(font);
LineMetrics lm = font.getLineMetrics(String.valueOf(icon),
g2.getFontRenderContext());
iconWidth = g2.getFontMetrics().charWidth(icon.getChar());
iconHeight = (int) lm.getHeight();
iconBaseline = (int) (lm.getHeight() - lm.getLeading() - lm
.getDescent());
g2.dispose();
}
private void paintImageBuffer() {
if (imageBuffer == null) {
GraphicsConfiguration config = GraphicsEnvironment
.getLocalGraphicsEnvironment().getDefaultScreenDevice()
.getDefaultConfiguration();
imageBuffer = config.createCompatibleImage(iconWidth, iconHeight,
Transparency.TRANSLUCENT);
} else {
int pixelSize = imageBuffer.getWidth() * imageBuffer.getHeight()
* 4;
imageBuffer.getRaster().setPixels(0, 0, iconWidth, iconHeight,
new int[pixelSize]);
}
Graphics2D g2 = imageBuffer.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
g2.setFont(font);
g2.setColor(color);
g2.drawString(String.valueOf(icon), 0, iconBaseline);
g2.dispose();
}
}