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
9
10
11
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
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
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
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
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
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
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
135 reds[i] = greens[i] = blues[i] = (byte) 0xff;
136
137
138 for (i = 0; i < step1; i++)
139 blues[i] = (byte) ((int) ((i / (step1 * 2.0) + 0.5) * 255.0) & 0xff);
140
141
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
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
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
177
178
179
180
181
182
183
184
185 public abstract IndexColorModel createLUT(int bits);
186
187
188
189
190
191
192
193
194
195 public abstract IndexColorModel getLUT(int bits);
196
197 }