View Javadoc

1   package de.desy.acop.video.displayer;
2   
3   import java.awt.image.IndexColorModel;
4   import java.util.HashMap;
5   import java.util.Map;
6   
7   /**
8    * Color map enumeration. Using a memorization "cache", which stores previously
9    * computed lookup tables.
10   * 
11   * @author mdavid, sweisse
12   */
13  public enum ColorMap {
14  
15  	NONE {
16  		@Override
17  		public IndexColorModel createLUT(int bits) {
18  			throw new AssertionError("Color lookup table can not be created, colorMap = " + this);
19  		}
20  
21  		@Override
22  		public IndexColorModel getLUT(int bits) {
23  			throw new AssertionError("Color lookup table can not be obtained, colorMap = " + this);
24  		}
25  	},
26  
27  	/**
28  	 * grayscale mode
29  	 */
30  	GRAYSCALE {
31  		private Map<Integer, IndexColorModel> cache = new HashMap<Integer, IndexColorModel>();
32  
33  		@Override
34  		public IndexColorModel createLUT(int bits) {
35  			int size = 1 << bits;
36  			byte cmap[] = new byte[size];
37  			for (int i = 0; i < size; i++)
38  				cmap[i] = (byte) (255 * i / (size - 1) & 0xff);
39  			return new IndexColorModel(bits, size, cmap, cmap, cmap);
40  		}
41  
42  		@Override
43  		public IndexColorModel getLUT(int bits) {
44  			IndexColorModel cm = cache.get(bits);
45  			if (cm == null)
46  				cache.put(bits, cm = createLUT(bits));
47  			return cm;
48  		}
49  	},
50  
51  	/**
52  	 * PITZ false color mode
53  	 */
54  	PITZ {
55  		private Map<Integer, IndexColorModel> cache = new HashMap<Integer, IndexColorModel>();
56  
57  		@Override
58  		public IndexColorModel createLUT(int bits) {
59  			int size = 1 << bits;
60  
61  			byte[] reds = new byte[size];
62  			byte[] greens = new byte[size];
63  			byte[] blues = new byte[size];
64  
65  			int i = size - 1;
66  
67  			// white 255-255-255
68  			reds[i] = greens[i] = blues[i] = (byte) 0xff;
69  
70  			int step1 = (size / 3) + 1;
71  			int step2 = (size * 293 / 500) + 1;
72  			int step3 = (size * 2 / 3) + 1;
73  			int step4 = size - 1;
74  
75  			for (i = 1; i < step1; i++)
76  				blues[i] = (byte) ((int) ((-0.5608 / (size / 3 - 1.0) * (i - 1) + 1.0) * 255.0) & 0xff);
77  
78  			for (; i < step2; i++) {
79  				double m1 = 0.561 / ((size * 293 / 500) - (size / 3));
80  				double n1 = 0.263 - (m1 * (size / 3));
81  				double m2 = -0.4314 / ((size * 293 / 500) - (size / 3));
82  				double n2 = 0 - (m2 * (size * 293 / 500));
83  				greens[i] = (byte) ((int) ((m1 * i + n1) * 255d) & 0xff);
84  				blues[i] = (byte) ((int) ((m2 * i + n2) * 255d) & 0xff);
85  			}
86  
87  			// green
88  			for (; i < step3; i++) {
89  				double m1 = 0.176 / ((size * 2 / 3) - (size * 293 / 500));
90  				double n1 = 1 - (m1 * (size * 2 / 3));
91  				greens[i] = (byte) ((int) ((m1 * i + n1) * 255.0) & 0xff);
92  			}
93  
94  			// red
95  			for (; i < step4; i++) {
96  				double m1 = 0.737 / (size - (size * 2 / 3));
97  				reds[i] = (byte) ((int) ((m1 * (i - size) + 1) * 255.0) & 0xff);
98  			}
99  
100 			return new IndexColorModel(bits, size, reds, greens, blues);
101 		}
102 
103 		@Override
104 		public IndexColorModel getLUT(int bits) {
105 			IndexColorModel cm = cache.get(bits);
106 			if (cm == null)
107 				cache.put(bits, cm = createLUT(bits));
108 			return cm;
109 		}
110 	},
111 
112 	/**
113 	 * MATLAB JET false color mode
114 	 */
115 	JET {
116 		private Map<Integer, IndexColorModel> cache = new HashMap<Integer, IndexColorModel>();
117 
118 		@Override
119 		public IndexColorModel createLUT(int bits) {
120 			int size = 1 << bits;
121 
122 			byte[] reds = new byte[size];
123 			byte[] greens = new byte[size];
124 			byte[] blues = new byte[size];
125 
126 			int step1 = size / 8;
127 			int step2 = size * 3 / 8;
128 			int step3 = size * 5 / 8;
129 			int step4 = size * 7 / 8 + 1;
130 			int step5 = size - 1;
131 
132 			int i = size - 1;
133 
134 			// white 255-255-255
135 			reds[i] = greens[i] = blues[i] = (byte) 0xff;
136 
137 			// blue
138 			for (i = 0; i < step1; i++)
139 				blues[i] = (byte) ((int) ((i / (step1 * 2.0) + 0.5) * 255.0) & 0xff);
140 
141 			// green
142 			for (; i < step2; i++) {
143 				greens[i] = (byte) ((int) ((i / (step1 * 2.0) - 0.5) * 255.0) & 0xff);
144 				blues[i] = (byte) 0xff;
145 			}
146 
147 			for (; i < step3; i++) {
148 				reds[i] = (byte) ((int) ((i / (step1 * 2.0) - 1.5) * 255.0) & 0xff);
149 				greens[i] = (byte) 0xff;
150 				blues[i] = (byte) ((int) ((1.0 - (i / (step1 * 2.0) - 1.5)) * 255.0) & 0xff);
151 			}
152 
153 			// green
154 			for (; i < step4; i++) {
155 				reds[i] = (byte) 0xff;
156 				greens[i] = (byte) ((int) ((i / (-step1 * 2.0) + 3.5) * 255.0) & 0xff);
157 			}
158 
159 			// red
160 			for (; i < step5; i++)
161 				reds[i] = (byte) ((int) ((i / (-step1 * 2.0) + 4.5) * 255.0) & 0xff);
162 
163 			return new IndexColorModel(bits, size, reds, greens, blues);
164 		}
165 
166 		@Override
167 		public IndexColorModel getLUT(int bits) {
168 			IndexColorModel cm = cache.get(bits);
169 			if (cm == null)
170 				cache.put(bits, cm = createLUT(bits));
171 			return cm;
172 		}
173 	};
174 
175 	/**
176 	 * Creates an indexed color model.<br>
177 	 * Abstract method, have to be implemented for all enumerated values
178 	 * 
179 	 * @param bits
180 	 *            - the number of bits each pixel occupies
181 	 * @return indexed color model representation of the lookup table
182 	 * @throws IllegalArgumentException
183 	 *             - if bits is less than 1 or greater than 16
184 	 */
185 	public abstract IndexColorModel createLUT(int bits);
186 
187 	/**
188 	 * Returns indexed color model using caching.<br>
189 	 * Abstract method, have to be implemented for all enumerated values
190 	 * 
191 	 * @param bits
192 	 *            - bits per pixel
193 	 * @return indexed color model representation of the lookup table
194 	 */
195 	public abstract IndexColorModel getLUT(int bits);
196 
197 }