1 import java.awt.BorderLayout;
2 import java.awt.Color;
3 import java.awt.Dimension;
4 
5 import javax.swing.Box;
6 import javax.swing.JCheckBox;
7 import javax.swing.JFrame;
8 import javax.swing.JLabel;
9 import javax.swing.JList;
10 import javax.swing.JPanel;
11 import javax.swing.JScrollBar;
12 import javax.swing.JScrollPane;
13 import javax.swing.JSlider;
14 import javax.swing.JTextArea;
15 import javax.swing.event.ChangeEvent;
16 import javax.swing.event.ChangeListener;
17 import javax.swing.event.ListSelectionEvent;
18 import javax.swing.event.ListSelectionListener;
19 
20 
21 public class ColorWindow {
22 
23 	private double[] rgb = new double[3];
24 
25 	private JFrame frame;
26 	private JPanel colorPanel;
27 	private JTextArea rgbvalues;
28 	private JTextArea rgbhexvalues;
29 	private JSlider amountBar;
30 	private JSlider brightnessBar;
31 	private Box graphBox;
32 
33 	private double AMOUNT=0.5, BRIGHTNESS=0;
34 	private Boolean GAMMA=false, MERGE=false;
35 	private String SPECTRUMFILE="", PREV_SPECTRUMFILE="";
36 	private ColorCalculator cc = null;
37 
ColorWindow()38 	public ColorWindow(){
39 
40 		initComponents();
41 
42 		cc=new ColorCalculator();
43 	}
44 
45 
main(String args[])46 	public static void main(String args[]){
47 		new ColorWindow();
48 	}
49 
50 
applyGamma(double c)51 	private double applyGamma(double c){
52 		if (c>1) c=1;
53 
54 		double a = 0.055;
55 		if (c<0.0031308)
56 			c*=12.92;
57 		else
58 			c = (1+a) * Math.pow(c, 1/2.4) - a;
59 
60 		if (c>1) c=1;
61 
62 		return c;
63 	}
64 
65 
initComponents()66 	private void initComponents(){
67 		frame = new JFrame();
68 		frame.setLayout(new BorderLayout());
69 
70 		JCheckBox gammayesno = new JCheckBox("Use Gamma Correction" , GAMMA);
71 		gammayesno.addChangeListener(new ChangeListener() {
72 			@Override
73 			public void stateChanged(ChangeEvent e) {
74 					GAMMA = ((JCheckBox)e.getSource()).isSelected();
75 					action_calculateColor();
76 				}
77 			});
78 
79 		JCheckBox merge = new JCheckBox("Merge graphs", MERGE);
80 		merge.addChangeListener(new ChangeListener() {
81 			@Override
82 			public void stateChanged(ChangeEvent e) {
83 					MERGE = ((JCheckBox)e.getSource()).isSelected();
84 					drawGraphs(true);
85 				}
86 			});
87 
88 		Box toolsBox = Box.createHorizontalBox();
89 		toolsBox.add(gammayesno);
90 		toolsBox.add(merge);
91 
92 
93 		amountBar = new JSlider(0, 1000, 500);
94 		amountBar.addChangeListener(
95 				new ChangeListener() {
96 					@Override
97 					public void stateChanged(ChangeEvent e) {
98 						JSlider source = (JSlider)e.getSource();
99 						if (!source.getValueIsAdjusting())
100 							AMOUNT = (double)(source.getModel().getValue())/1000;
101 							action_calculateColor();
102 					}
103 				});
104 		amountBar.setPaintLabels(true);
105 
106 		brightnessBar = new JSlider(JSlider.VERTICAL, -100,100,0);
107 		brightnessBar.addChangeListener(new ChangeListener() {
108 			@Override
109 			public void stateChanged(ChangeEvent e) {
110 				JSlider source = (JSlider)e.getSource();
111 				if (!source.getValueIsAdjusting())
112 					BRIGHTNESS = (double)(source.getModel().getValue())/1000;
113 					action_calculateColor();
114 			}
115 		});
116 
117 
118 		JList folderList = GUITools.getFolderList(null);
119 		JPanel listPanel = new JPanel();
120 //		listPanel.setPreferredSize(new Dimension(120,500));
121 		listPanel.add(folderList);
122 		folderList.addListSelectionListener(
123 				new ListSelectionListener() {
124 					@Override
125 					public void valueChanged(ListSelectionEvent e) {
126 						PREV_SPECTRUMFILE = SPECTRUMFILE;
127 						SPECTRUMFILE = ((JList)e.getSource()).getSelectedValue().toString();
128 						action_calculateColor();
129 					}
130 				});
131 		JScrollPane scroll = new JScrollPane(listPanel);
132 		scroll.setAutoscrolls(true);
133 		scroll.setPreferredSize(new Dimension(125,500));
134 
135 		Box amBox = Box.createHorizontalBox();
136 		amBox.add(new JLabel("Amount"));
137 		amBox.add(amountBar);
138 
139 		Box rightBox = Box.createVerticalBox();
140 		rgbvalues = new JTextArea();
141 		rgbhexvalues = new JTextArea();
142 
143 		rightBox.add(rgbvalues);
144 		rightBox.add(rgbhexvalues);
145 		colorPanel = new JPanel();
146 		colorPanel.setMinimumSize(new Dimension(100,100));
147 		colorPanel.setPreferredSize(new Dimension(150,400));
148 		rightBox.add(colorPanel);
149 
150 		graphBox = Box.createVerticalBox();
151 
152 		frame.setMinimumSize(new Dimension(600,400));
153 		frame.getContentPane().add(rightBox, BorderLayout.EAST);
154 		frame.getContentPane().add(toolsBox, BorderLayout.NORTH);
155 		frame.getContentPane().add(graphBox, BorderLayout.CENTER);
156 		frame.getContentPane().add(amBox, BorderLayout.SOUTH);
157 //		frame.getContentPane().add(brightnessBar, BorderLayout.WEST);
158 //		frame.getContentPane().add(listPanel, BorderLayout.WEST);
159 		frame.getContentPane().add(scroll, BorderLayout.WEST);
160 
161 		frame.setTitle("Color viewer version 5");
162 
163 		frame.pack();
164 		frame.setVisible(true);
165 
166 
167 
168 	}
169 
170 
action_calculateColor()171 	private void action_calculateColor(){
172 
173 		if(!SPECTRUMFILE.equals(PREV_SPECTRUMFILE)){
174 			cc.loadAbsorbSpectrum(SPECTRUMFILE);
175 		}
176 
177 		rgb = cc.calculateIlluminatedColor(AMOUNT, BRIGHTNESS);
178 
179 		System.out.println("Amount: "+AMOUNT+" , BRIGHTNESS: "+BRIGHTNESS+" GAMMA correction: "+GAMMA);
180 
181 		if(GAMMA)
182 			for (int i=0; i<3; i++)
183 				rgb[i] = applyGamma(rgb[i]);
184 
185 		// when transforming from XYZ to RGB some values can be negative or greater than 1
186 		// this means the color cannot be exactly represented in RGB space
187 		for (int i=0;i<rgb.length;i++){
188 			 if(rgb[i]<0)
189 				 rgb[i]=0.0;
190 			 if(rgb[i]>1)
191 				 rgb[i]=1.0;
192 		 }
193 
194 		Color color = new Color ((float)rgb[0], (float)rgb[1], (float)rgb[2]);
195 		colorPanel.setBackground(color);
196 		rgbvalues.setText("RGB: "+ color.getRed() + " " + color.getGreen() + " " + color.getBlue());
197 		rgbhexvalues.setText("RGB: #"+ Integer.toHexString(color.getRed()).toUpperCase() + Integer.toHexString(color.getGreen()).toUpperCase() + Integer.toHexString(color.getBlue()).toUpperCase() );
198 
199 		drawGraphs(false);
200 
201 		frame.validate();
202 	}
203 
204 
drawGraphs(Boolean validate)205 	private void drawGraphs(Boolean validate){
206 		graphBox.removeAll();
207 		if (MERGE){
208 			graphBox.add(cc.createGraph());
209 		} else {
210 			graphBox.add(cc.createAbsorbptionGraph());
211 			graphBox.add(cc.createResultLightGraph());
212 		}
213 
214 		if(validate)
215 			frame.validate();
216 	}
217 
218 
219 }
220