1 package de.desy.video.sw;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 public final class CColorLookupTable
30 {
31
32
33
34 private int [] m_ColorLookupTable=null;
35
36
37
38 private int m_iColorMode = FALSEPITZ;
39
40
41
42
43 private int m_iCurMaxColors=0;
44
45
46
47 private int m_iEBitPP = 0;
48
49
50 public static final int GRAYSCALE=1;
51
52 public static final int FALSEPITZ=2;
53
54 public static final int FALSEJET=3;
55
56
57
58
59
60
61 public CColorLookupTable()
62 {
63 AdjustTable( FALSEPITZ, 1, 8);
64 }
65
66
67
68
69
70
71
72 public int[] getColorLookupTable()
73 {
74 return m_ColorLookupTable;
75 }
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91 public boolean AdjustTable( int aMode, int aByPP, int aEBitPP)
92 {
93 int numColors = aByPP << 8;
94
95 if ((m_iCurMaxColors != numColors) || (m_iEBitPP != aEBitPP) || (aMode != m_iColorMode))
96 {
97
98 m_iCurMaxColors = numColors;
99 m_iEBitPP = aEBitPP;
100 m_iColorMode = aMode;
101 m_ColorLookupTable = new int[1 << (aByPP*8)];
102
103 if (m_iColorMode == FALSEPITZ)
104 fillColorLookupTablePITZFalseColors();
105 else if (m_iColorMode == FALSEJET)
106 fillColorLookupTableJETFalseColors();
107 else
108 fillColorLookupTableGrayscale();
109
110
111
112 int maxval = 1 << aEBitPP;
113 int maxval_total = 1 << (aByPP*8);
114 int left = maxval_total-maxval;
115
116 if (left > 0)
117 {
118 try
119 {
120 for (int i=0;i<left;i++)
121 {
122
123
124 m_ColorLookupTable[i+maxval] = (255 << 24) | (255 << 16) | (255);
125 }
126 }
127 catch( ArrayIndexOutOfBoundsException ex) {}
128
129 }
130
131 return true;
132 }
133 return false;
134 }
135
136
137
138
139
140
141 private void fillColorLookupTablePITZFalseColors()
142 {
143
144
145 int dec = (int) (1 << m_iEBitPP);
146 double decdbl = (double) dec;
147 int i;
148
149
150 m_ColorLookupTable[0] = (255 << 24);
151
152
153 m_ColorLookupTable[dec-1] = (255 << 24) | (255 << 16) | (255 << 8) | (255);
154
155 int step1min = 1;
156 int step1max = (int) (decdbl/3);
157
158 int step2min = step1max + 1;
159 int step2max = (int) ((decdbl*293)/500);
160
161 int step3min = step2max + 1;
162 int step3max = (int) ((decdbl*2)/3);
163
164 int step4min = step3max + 1;
165 int step4max = (int) decdbl-1;
166
167 for (i=step1min;i<step2min;i++)
168 {
169 double m = -0.5608 / (dec/3-1.0);
170 double n = 1.0 - m*1.0;
171
172 m_ColorLookupTable[i] = (255 << 24) | ((int)((m*i+n)*255.0));
173 }
174
175 for (i=step2min;i<step3min;i++)
176 {
177 double m1= 0.561 / ( (dec*293/500)-(dec/3));
178 double n1 = 0.263 - (m1 * (dec/3));
179
180 double m2= -0.4314 / ( (dec*293/500)-(dec/3));
181 double n2 = 0 - (m2 * (dec*293/500));
182
183
184 m_ColorLookupTable[i] = (255 << 24) | (((int)((m1*i+n1)*255.0))<<8) | ((int)((m2*i+n2)*255.0));
185 }
186
187 for (i=step3min;i<step4min;i++)
188 {
189 double m1= 0.176 / ( (dec*2/3)-(dec*293/500));
190 double n1 = 1 - (m1 * (dec*2/3));
191
192 m_ColorLookupTable[i] = (255 << 24) | (((int)((m1*i+n1)*255.0))<<8);
193 }
194
195 for (i=step4min;i<step4max;i++)
196 {
197 double m1= 0.737 / (dec-(dec*2/3));
198 double n1 = 1 - (m1 * dec);
199
200 m_ColorLookupTable[i] = (255 << 24) | (((int)((m1*i+n1)*255.0))<<16);
201 }
202
203 }
204
205
206
207
208
209
210
211
212 private void fillColorLookupTableJETFalseColors()
213 {
214 int dec = (int) (1 << m_iEBitPP);
215 int i;
216
217 int step1min = 0;
218 int step1max = (int) ((dec/8)-1);
219
220 int step2min = step1max + 1;
221 int step2max = (int) (((dec*3)/8)-1);
222
223 int step3min = step2max + 1;
224 int step3max = (int) (((dec*5)/8)-1);
225
226 int step4min = step3max + 1;
227 int step4max = (int) (((dec*7)/8)-1);
228
229 int step5min = step4max + 1;
230 int step5max = (int) (dec-1);
231
232
233 m_ColorLookupTable[dec-1] = (255 << 24) | (255 << 16) | (255 << 8) | (255);
234
235 double Dstep2min = (double) step2min;
236
237 for (i=step1min;i<step2min;i++)
238 {
239 double Di= (double) i;
240 double blue = (((Di/2.0)/Dstep2min)+0.5)*255.0;
241
242
243 m_ColorLookupTable[i] = (255 << 24) | (int) blue;
244 }
245
246 for (i=step2min;i<step3min;i++)
247 {
248 double Di = (double) i;
249 double green = ((Di/(Dstep2min*2.0))-0.5)*255.0;
250
251
252 m_ColorLookupTable[i] = (255 << 24) | (((int)green)<<8) | 255;
253 }
254
255 for (i=step3min;i<step4min;i++)
256 {
257 double Di = (double) i;
258 double red = ((Di/(Dstep2min*2.0))-1.5) *255.0;
259 double blue = ((1.0-((Di/(Dstep2min*2.0))-1.5))*255.0);
260
261
262 m_ColorLookupTable[i] = (255 << 24) | (((int)red)<<16) | (255<<8) | ((int) blue);
263 }
264
265 for (i=step4min;i<step5min;i++)
266 {
267 double Di = (double) i;
268 double green = (((Di/(-(Dstep2min*2.0)))+3.5) *255.0);
269
270
271 m_ColorLookupTable[i] = (255 << 24) | (255<<16) | (((int)green)<<8);
272 }
273
274 for (i=step5min;i<step5max;i++)
275 {
276 double Di = (double) i;
277 double red = (((Di/(-(Dstep2min*2.0)))+4.5) *255.0);
278
279
280 m_ColorLookupTable[i] = (255 << 24) | (((int)red)<<16);
281 }
282
283 }
284
285
286
287
288
289
290
291
292 private void fillColorLookupTableGrayscale()
293 {
294 int maxval = (int) (1 << m_iEBitPP);
295
296 try
297 {
298 for (int i=0;i<maxval;i++)
299 {
300 int gray = (int) ((255.0*i)/maxval);
301
302 m_ColorLookupTable[i] = (255 << 24) | (gray << 16) | (gray << 8) | (gray);
303 }
304 }
305 catch( ArrayIndexOutOfBoundsException ex) {}
306
307 }
308 }