package test;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import com.kreative.paint.material.colorpalette.CheckerboardPaint;
import com.kreative.paint.material.sprite.ColorTransform;
public class ColorTransformDemo {
private static final int[] ALPHAS = {
0x00000000, 0x11000000, 0x22000000, 0x33000000, 0x44000000, 0x55000000,
0x66000000, 0x77000000, 0x88000000, 0x99000000, 0xAA000000, 0xBB000000,
0xCC000000, 0xDD000000, 0xEE000000, 0xFF000000
};
private static final int[] COLORS = {
0x000000, 0x111111, 0x222222, 0x333333, 0x444444, 0x555555,
0x666666, 0x777777, 0x888888, 0x999999, 0xAAAAAA, 0xBBBBBB,
0xCCCCCC, 0xDDDDDD, 0xEEEEEE, 0xFFFFFF,
0xFF0000, 0xFF5500, 0xFFAA00, 0xFFFF00, 0xAAFF00, 0x55FF00,
0x00FF00, 0x00FF55, 0x00FFAA, 0x00FFFF, 0x00AAFF, 0x0055FF,
0x0000FF, 0x5500FF, 0xAA00FF, 0xFF00FF, 0xFF00AA, 0xFF0055
};
private static final int[] DEFAULT_PALETTE = {
0xFF000000, 0xFFFFFFFF, 0xFFFF0000, 0xFFFFFF00,
0xFF00FF00, 0xFF00FFFF, 0xFF0000FF, 0xFFFF00FF
};
private static final int[] REVERSE_PALETTE = {
0xFFFFFFFF, 0xFF000000, 0xFF0000FF, 0xFF00FFFF,
0xFF00FF00, 0xFFFFFF00, 0xFFFF0000, 0xFFFF00FF
};
private static final Random RANDOM = new Random();
private static int[] makePixelArray() {
int w = ALPHAS.length << 2;
int h = COLORS.length << 1;
int[] p = new int[w * h];
for (int i = 0, y = 0; y < h; y++) {
int c = COLORS[y >> 1];
for (int x = 0; x < w; x++) {
int a = ALPHAS[x >> 2];
p[i++] = a | c;
}
}
return p;
}
private static int[] makeRandomPalette(boolean alpha) {
int[] p = new int[8];
for (int i = 0; i < 8; i++) {
p[i] = RANDOM.nextInt();
if (!alpha) p[i] |= 0xFF000000;
}
return p;
}
private static BufferedImage[] makeImages(int[] palette) {
BufferedImage[] images = new BufferedImage[0x40];
int w = ALPHAS.length << 2;
int h = COLORS.length << 1;
int[] pt = makePixelArray();
for (int i = 0; i < 0x40; i++) {
ColorTransform ct = new ColorTransform(i);
int[] p = new int[pt.length];
ct.preparePixels(p, 0, pt, 0, pt.length);
ct.replacePixels(
p, 0, p, 0, pt.length,
palette[0], palette[1], palette[2], palette[3],
palette[4], palette[5], palette[6], palette[7]
);
images[i] = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
images[i].setRGB(0, 0, w, h, p, 0, w);
}
return images;
}
private static abstract class PaletteButtonListener implements ActionListener {
private final JPanel imagePanel;
public PaletteButtonListener(JPanel imagePanel) {
this.imagePanel = imagePanel;
}
public abstract int[] getPalette();
@Override
public final void actionPerformed(ActionEvent e) {
imagePanel.removeAll();
for (BufferedImage image : makeImages(getPalette())) {
imagePanel.add(new JLabel(new ImageIcon(image)));
}
imagePanel.revalidate();
}
}
private static JPanel makePanel() {
JPanel imagePanel = new JPanel(new GridLayout(0, 16, 20, 20));
imagePanel.setOpaque(false);
for (BufferedImage image : makeImages(DEFAULT_PALETTE)) {
imagePanel.add(new JLabel(new ImageIcon(image)));
}
JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 8, 8));
buttonPanel.setOpaque(false);
JButton db = new JButton("Default");
db.addActionListener(new PaletteButtonListener(imagePanel) {
@Override
public int[] getPalette() {
return DEFAULT_PALETTE;
}
});
buttonPanel.add(db);
JButton rb = new JButton("Reverse");
rb.addActionListener(new PaletteButtonListener(imagePanel) {
@Override
public int[] getPalette() {
return REVERSE_PALETTE;
}
});
buttonPanel.add(rb);
JButton rcb = new JButton("Random");
rcb.addActionListener(new PaletteButtonListener(imagePanel) {
@Override
public int[] getPalette() {
return makeRandomPalette(false);
}
});
buttonPanel.add(rcb);
JButton rab = new JButton("Alpha");
rab.addActionListener(new PaletteButtonListener(imagePanel) {
@Override
public int[] getPalette() {
return makeRandomPalette(true);
}
});
buttonPanel.add(rab);
JPanel mainPanel = new JPanel(new BorderLayout(20, 20)) {
private static final long serialVersionUID = 1L;
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setPaint(CheckerboardPaint.LIGHT);
g2.fillRect(0, 0, getWidth(), getHeight());
}
};
mainPanel.add(imagePanel, BorderLayout.CENTER);
mainPanel.add(buttonPanel, BorderLayout.PAGE_END);
mainPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
return mainPanel;
}
private static JFrame makeFrame() {
JFrame frame = new JFrame("Color Transform Demo");
frame.setContentPane(makePanel());
frame.pack();
frame.setResizable(false);
return frame;
}
public static void main(String[] args) {
makeFrame().setVisible(true);
}
}