package com.seaglasslookandfeel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
public class DeriveColors {
private static JTextField c;
private static JTextField h;
private static JTextField s;
private static JTextField b;
private static JTextPane result;
public static void main(String[] args) {
try {
UIManager.setLookAndFeel("com.seaglasslookandfeel.SeaGlassLookAndFeel");
} catch (Exception e) {
e.printStackTrace();
}
SwingUtilities.invokeLater(new Runnable() {
public void run() {
c = new JTextField();
c.setPreferredSize(new Dimension(180, 25));
h = new JTextField();
h.setPreferredSize(new Dimension(180, 25));
s = new JTextField();
s.setPreferredSize(new Dimension(180, 25));
b = new JTextField();
b.setPreferredSize(new Dimension(180, 25));
JButton calc = new JButton();
calc.setPreferredSize(new Dimension(100, 30));
calc.setAction(new AbstractAction() {
public void actionPerformed(ActionEvent e) {
String cStr = c.getText();
if (cStr.startsWith("0x")) cStr = cStr.substring(2);
Color color = new Color(Integer.parseInt(cStr, 16));
float hOffset = Float.parseFloat(h.getText());
float sOffset = Float.parseFloat(s.getText());
float bOffset = Float.parseFloat(b.getText());
result.setText(deriveColor(color, hOffset, sOffset, bOffset));
}
});
calc.setText("Calculate");
result = new JTextPane();
result.setPreferredSize(new Dimension(180, 100));
result.setEditable(false);
JPanel panel = new JPanel();
panel.setBackground(new Color(248, 248, 248));
panel.add(c);
panel.add(h);
panel.add(s);
panel.add(b);
panel.add(calc);
panel.add(result);
JFrame frame = new JFrame("Title");
frame.add(panel, BorderLayout.CENTER);
frame.setSize(275, 225);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
}
});
}
private static String deriveColor(Color color, float hOffset, float sOffset, float bOffset) {
Color dest = deriveColor(color, hOffset, sOffset, bOffset, 0);
return String.format("%06x", (dest.getRGB() & 0xFFFFFF));
}
private static Color deriveColor(Color src, float hOffset, float sOffset, float bOffset, int aOffset) {
float[] tmp = Color.RGBtoHSB(src.getRed(), src.getGreen(), src.getBlue(), null);
// apply offsets
tmp[0] = clamp(tmp[0] + hOffset);
tmp[1] = clamp(tmp[1] + sOffset);
tmp[2] = clamp(tmp[2] + bOffset);
int alpha = clamp(src.getAlpha() + aOffset);
return new Color((Color.HSBtoRGB(tmp[0], tmp[1], tmp[2]) & 0xFFFFFF) | (alpha << 24), true);
}
private static float clamp(float value) {
if (value < 0) {
value = 0;
} else if (value > 1) {
value = 1;
}
return value;
}
private static int clamp(int value) {
if (value < 0) {
value = 0;
} else if (value > 255) {
value = 255;
}
return value;
}
}