package nbtool.images;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import nbtool.util.Debug;
public class EdgeImage extends ImageParent {
public EdgeImage(int w, int h, byte[] d) {
super(w, h, d);
}
private static final Color[] angleMap = initColorMap();
private static Color[] initColorMap(){
Color[] ret = new Color[256];
Color[] top = {Color.RED,
Color.ORANGE,
Color.YELLOW,
Color.GREEN,
Color.BLUE,
Color.MAGENTA,
Color.GRAY,
Color.PINK};
assert(top.length == 8);
for (int i = 0; i < 256; ++i) {
int bi = i / 32;
int ni = (bi + 1) % 8;
int dist = i % 32;
Color bc = top[bi];
Color nc = top[ni];
int dr = nc.getRed() - bc.getRed();
int dg = nc.getGreen() - bc.getGreen();
int db = nc.getBlue() - bc.getBlue();
Color tc = new Color(
bc.getRed() + (dist * dr) / 32,
bc.getGreen() + (dist * dg) / 32,
bc.getBlue() + (dist * db) / 32
);
ret[i] = tc;
}
return ret;
};
@Override
public BufferedImage toBufferedImage() {
BufferedImage ret = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
for (int x = 0; x < width; ++x) {
for (int y = 0; y < height; ++y) {
ret.setRGB(x, y, Color.BLACK.getRGB());
}
}
try {
DataInputStream dis = new DataInputStream(new ByteArrayInputStream(data));
int n_edges = data.length / (4 * 4);
Debug.info( "%d edges expected.", n_edges);
for (int i = 0; i < n_edges; ++i) {
int x = dis.readInt();
int y = dis.readInt();
int mag = dis.readInt();
int ang = dis.readInt();
Color base = angleMap[ang];
ret.setRGB(x, y, base.getRGB());
}
} catch (Exception e) {
Debug.error( "Conversion from bytes to EdgeImage to BufferedImage failed.");
e.printStackTrace();
return null;
}
return ret;
}
@Override
public String encoding() {
return "n/a";
}
}