package aliview.gui.pane;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import java.util.Arrays;
import org.apache.log4j.Logger;
public class CharPixelsBothNucAndAA extends CharPixels{
private static final Logger logger = Logger.getLogger(CharPixelsBothNucAndAA.class);
public static final int CASE_UNTOUCHED = 0;
public static final int CASE_UPPER = 1;
public static final int CASE_LOWER = 2;
private Color color;
private RGBArray rgbArray;
private int width;
private int height;
private BufferedImage bi;
private Graphics2D g2;
private Font font;
private int minFontSize;
private int fontCase;
private Color nucFgColor;
private Color nucBgColor;
private Color aaBgColor;
private Color aaFgColor;
private char chAA;
private char chNuc;
public CharPixelsBothNucAndAA(char chNuc, char chAA, int width, int height, Color nucFgColor, Color nucBgColor, Color aaFgColor, Color aaBgColor, Font font, int minFontSize, int fontCase){
super(chAA, width, height, aaFgColor, aaBgColor, font, minFontSize, fontCase);
if(width < 1){
width = 1;
}
if(height < 1){
height = 1;
}
this.chAA = chAA;
this.chNuc = chNuc;
this.width = width;
this.height = height;
this.font = font;
this.nucFgColor = nucFgColor;
this.nucBgColor = nucBgColor;
this.aaFgColor = aaFgColor;
this.aaBgColor = aaBgColor;
this.minFontSize = minFontSize;
this.fontCase = fontCase;
}
public int[] getPixels() {
return getRGBArray().getBackend();
}
public RGBArray getRGBArray(){
if(rgbArray == null){
BufferedImage bi = createPixelImageFromStaticBufferedImage();
int[] origData = ((DataBufferInt)bi.getRaster().getDataBuffer()).getData();
// copy array
int[] pixCopy = Arrays.copyOf(origData, origData.length);
rgbArray = new RGBArray(pixCopy, width, height);
}
return rgbArray;
}
private BufferedImage createPixelImageFromStaticBufferedImage() {
// A static image is used instead of creating one for each char
// BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
// Graphics2D big2 = bi.createGraphics();
if(bi == null){
bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
g2 = bi.createGraphics();
g2.setFont(font);
// g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
// g2.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
// This need to be off because I use exact font width in createAdjustedDerivedBaseFont
g2.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF);
if(width < 10){
g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
}
// g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
}
g2.setColor(aaBgColor);
g2.fillRect(0, 0, width, height/2);
// Only draw if font is a good size
if(width > minFontSize){
g2.setColor(aaFgColor);
int leftCharOffset = (int)(0.15 * width);
int bottomCharOffset = (int)(0.2 * height/2);
char displayChar = chAA;
if(fontCase == CASE_UPPER){
displayChar = Character.toUpperCase(chAA);
}else if(fontCase == CASE_LOWER){
displayChar = Character.toLowerCase(chAA);
}
g2.drawString("" + displayChar, leftCharOffset, height/2 - bottomCharOffset);
}
g2.setColor(nucBgColor);
g2.fillRect(0, 0 + height/2, width, height/2);
// Only draw if font is a good size
if(width > minFontSize){
g2.setColor(nucFgColor);
int leftCharOffset = (int)(0.15 * width);
int bottomCharOffset = (int)(0.2 * height/2);
char displayChar = chNuc;
if(fontCase == CASE_UPPER){
displayChar = Character.toUpperCase(chNuc);
}else if(fontCase == CASE_LOWER){
displayChar = Character.toLowerCase(chNuc);
}
g2.drawString("" + displayChar, leftCharOffset, height - bottomCharOffset);
}
// int[] origData = ((DataBufferInt)bi.getRaster().getDataBuffer()).getData();
// logger.info("color" + g2.getColor());
// logger.info("beforeA=" + origData[0]);
// g2.setColor(new Color(0,0,0,140));
// g2.fillRect(0, 0, width, height);
// origData = ((DataBufferInt)bi.getRaster().getDataBuffer()).getData();
// logger.info("after_A=" + origData[0]);
// g2.dispose();
return bi;
}
}