Statistics
| Revision:

svn-gvsig-desktop / branches / org.gvsig.desktop-2018a / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.mapcontext / org.gvsig.fmap.mapcontext.impl / src / main / java / org / gvsig / raster / lib / legend / impl / DefaultColorManager.java @ 43803

History | View | Annotate | Download (14.7 KB)

1
/* gvSIG. Desktop Geographic Information System.
2
 *
3
 * Copyright ? 2007-2017 gvSIG Association
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18
 * MA  02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us
21
 * at info AT gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.raster.lib.legend.impl;
24

    
25

    
26

    
27
/**
28
 * Coversi?n de de colores y valores de pixel aplicando distintos m?todos.
29
 *
30
 * 31/10/2007
31
 * @author Nacho Brodin nachobrodin@gmail.com
32
 * 04/12/2017
33
 * @author fdiaz
34
 */
35
public class DefaultColorManager implements ColorManager {
36

    
37
    public double[] RGBtoHSL(int sourceRed, int sourceGreen, int sourceBlue) {
38
        double scaler, scaleg, scaleb;
39
        double sat;
40
        double red, green, blue;
41
        double low, high, intens;
42
        double hue = 0.0;
43
        double[] res1 = new double[3];
44

    
45
        scaler = (double) (sourceRed / 255.0);
46
        scaleg = (double) (sourceGreen / 255.0);
47
        scaleb = (double) (sourceBlue / 255.0);
48

    
49
        high = scaler;
50

    
51
        if (scaleg > high) {
52
            high = scaleg;
53
        }
54
        if (scaleb > high) {
55
            high = scaleb;
56
        }
57
        low = scaler;
58
        if (scaleg < low) {
59
            low = scaleg;
60
        }
61
        if (scaleb < low) {
62
            low = scaleb;
63
        }
64

    
65
        intens = ((high + low) / 2.0);
66
        if (high == low) {
67
            sat = 0.0;
68
            hue = 0.0;
69
            res1[0] = (double) hue;
70
            res1[1] = (double) sat;
71
            res1[2] = (double) intens;
72
        } else if (high != low) {
73
            if (intens <= 0.5) {
74
                sat = (high - low) / (high + low);
75
            } else {
76
                sat = (high - low) / (2 - high - low);
77
            }
78
            red = (high - scaler) / (high - low);
79
            green = (high - scaleg) / (high - low);
80
            blue = (high - scaleb) / (high - low);
81
            if (scaler == high) {
82
                hue = blue - green;
83
            } else {
84
                if (scaleg == high) {
85
                    hue = 2 + red - blue;
86
                } else {
87
                    if (scaleb == high) {
88
                        hue = 4 + green - red;
89
                    }
90
                }
91
            }
92
            hue *= 60.0;
93
            if (hue < 0.0) {
94
                hue += 360.0;
95
            }
96
            res1[0] = (double) (hue);
97
            res1[1] = (double) (sat);
98
            res1[2] = (double) (intens);
99
        }
100
        return res1;
101
    }
102

    
103
    public double[] RGBtoHSV(int sourceRed, int sourceGreen, int sourceBlue) {
104
        double scaler, scaleg, scaleb;
105
        double sat;
106
        double red, green, blue;
107
        double low, high, value;
108
        double hue = 0.0;
109
        double[] res1 = new double[3];
110

    
111
        scaler = (double) (sourceRed / 255.0);
112
        scaleg = (double) (sourceGreen / 255.0);
113
        scaleb = (double) (sourceBlue / 255.0);
114

    
115
        high = scaler;
116

    
117
        if (scaleg > high) {
118
            high = scaleg;
119
        }
120
        if (scaleb > high) {
121
            high = scaleb;
122
        }
123
        low = scaler;
124
        if (scaleg < low) {
125
            low = scaleg;
126
        }
127
        if (scaleb < low) {
128
            low = scaleb;
129
        }
130

    
131
        value = high;
132
        if (high == 0) {
133
            sat = 0.0;
134
            hue = 0.0;
135
            res1[0] = (double) hue;
136
            res1[1] = (double) sat;
137
            res1[2] = (double) value;
138
        } else {
139
            sat = (high - low) / high;
140
            red = (high - scaler) / (high - low);
141
            green = (high - scaleg) / (high - low);
142
            blue = (high - scaleb) / (high - low);
143
            if (scaler == high) {
144
                hue = blue - green;
145
            } else if (scaleg == high) {
146
                hue = 2 + red - blue;
147
            } else if (scaleb == high) {
148
                hue = 4 + green - red;
149
            }
150
            hue *= 60.0;
151
            if (hue < 0.0) {
152
                hue += 360.0;
153
            }
154
            res1[0] = (double) (hue);
155
            res1[1] = (double) (sat);
156
            res1[2] = (double) (value);
157
        }
158
        return res1;
159
    }
160
    /**
161
     * return HSLtoRGB((360.0 * h / 255.0), (s / 255.0), (i / 255.0));
162
     */
163
    public int[] HSLtoRGB(int h, int s, int l) {
164
        /*
165
         * return HSLtoRGB((360.0 * h / 255.0),
166
         * (s / 255.0),
167
         * (i / 255.0));
168
         */
169
        double red; /* the red band output */
170
        double red255; /* the red band output */
171
        double green; /* the green band output */
172
        double green255; /* the green band output */
173
        double blue; /* the blue band output */
174
        double blue255; /* the blue band output */
175
        double m1; /* value used for determining RGB */
176
        double m2; /* value used for determining RGB */
177
        double scalei; /* intensity value */
178
        double scales; /* saturation value */
179
        double hue; /* hue */
180
        double savehue; /* save the hue for future processing */
181
        int[] res = new int[3];
182

    
183
        if (h == s && h == 0) {
184
            res[0] = res[1] = res[2] = l;
185
            return res;
186
        }
187

    
188
        red = green = blue = 0.0;
189
        scalei = (double) (l / 255.0);
190
        scales = (double) (s / 255.0);
191
        m2 = 0.0;
192

    
193
        if (scalei <= 0.50) {
194
            m2 = scalei * (1.0 + scales);
195
        } else if (scalei > 0.50) {
196
            m2 = scalei + scales - (scalei * scales);
197
        }
198
        m1 = 2.0 * scalei - m2;
199

    
200
        hue = (double) 360.0 * h / 255.0;
201

    
202
        if (scales == 0.0) {
203
            if (hue == -1.0) {
204
                red = scalei;
205
                green = scalei;
206
                blue = scalei;
207
            }
208
        } else {
209
            savehue = hue + 120.0;
210
            if (savehue > 360.0) {
211
                savehue -= 360.0;
212
            }
213
            if (savehue < 0.0) {
214
                savehue += 360.0;
215
            }
216
            if (savehue < 60.0) {
217
                red = m1 + (m2 - m1) * savehue / 60.0;
218
            } else if (savehue < 180.0) {
219
                red = m2;
220
            } else if (savehue < 240.0) {
221
                red = m1 + (m2 - m1) * (240.0 - savehue) / 60.0;
222
            } else {
223
                red = m1;
224
            }
225

    
226
            savehue = hue;
227
            if (savehue > 360.0) {
228
                savehue -= 360.0;
229
            }
230
            if (savehue < 0.0) {
231
                savehue += 360.0;
232
            }
233
            if (savehue < 60.0) {
234
                green = m1 + (m2 - m1) * savehue / 60.0;
235
            } else if (savehue < 180.0) {
236
                green = m2;
237
            } else if (savehue < 240.0) {
238
                green = m1 + (m2 - m1) * (240.0 - savehue) / 60.0;
239
            } else {
240
                green = m1;
241
            }
242
            savehue = hue - 120.0;
243

    
244
            if (savehue > 360.0) {
245
                savehue -= 360.0;
246
            }
247
            if (savehue < 0.0) {
248
                savehue += 360.0;
249
            }
250
            if (savehue < 60.0) {
251
                blue = m1 + (m2 - m1) * savehue / 60.0;
252
            } else if (savehue < 180.0) {
253
                blue = m2;
254
            } else if (savehue < 240.0) {
255
                blue = m1 + (m2 - m1) * (240.0 - savehue) / 60.0;
256
            } else {
257
                blue = m1;
258
            }
259
        }
260

    
261
        red255 = red * 255.0;
262
        green255 = green * 255.0;
263
        blue255 = blue * 255.0;
264
        if (red255 > 255.0) {
265
            red = 255.0;
266
        } else {
267
            red = red255;
268
        }
269
        if (green255 > 255.0) {
270
            green = 255.0;
271
        } else {
272
            green = green255;
273
        }
274
        if (blue255 > 255.0) {
275
            blue = 255.0;
276
        } else {
277
            blue = blue255;
278
        }
279

    
280
        //FIXME: ??????????
281

    
282
        if (red > 254.5) {
283
            red = 254.5;
284
        }
285
        if (red < 0.0) {
286
            red = 0.0;
287
        }
288
        if (green > 254.5) {
289
            green = 254.5;
290
        }
291
        if (green < 0.0) {
292
            green = 0.0;
293
        }
294
        if (blue > 254.5) {
295
            blue = 254.5;
296
        }
297
        if (blue < 0.0) {
298
            blue = 0.0;
299
        }
300

    
301
        res[0] = (int) (red + 0.5);
302
        res[1] = (int) (green + 0.5);
303
        res[2] = (int) (blue + 0.5);
304
        return res;
305
    }
306

    
307
    public int[] HSLtoRGB(double h, double s, double l) {
308
        double red; /* the red band output */
309
        double red255; /* the red band output */
310
        double green; /* the green band output */
311
        double green255; /* the green band output */
312
        double blue; /* the blue band output */
313
        double blue255; /* the blue band output */
314
        double m1; /* value used for determining RGB */
315
        double m2; /* value used for determining RGB */
316
        double scalei; /* intensity value */
317
        double scales; /* saturation value */
318
        double hue; /* hue */
319
        double savehue; /* save the hue for future processing */
320
        int[] res = new int[3];
321

    
322
        if (h == s && h == 0) {
323
            res[0] = res[1] = res[2] = (int) (l * 255);
324
            return res;
325
        }
326

    
327
        red = green = blue = 0.0;
328
        scalei = l;
329
        scales = s;
330
        m2 = 0.0;
331

    
332
        if (scalei <= 0.50) {
333
            m2 = scalei * (1.0 + scales);
334
        } else if (scalei > 0.50) {
335
            m2 = scalei + scales - (scalei * scales);
336
        }
337
        m1 = 2.0 * scalei - m2;
338

    
339
        hue = h;
340

    
341
        if (scales == 0.0) {
342
            if (hue == -1.0) {
343
                red = scalei;
344
                green = scalei;
345
                blue = scalei;
346
            }
347
        } else {
348
            savehue = hue + 120.0;
349
            if (savehue > 360.0) {
350
                savehue -= 360.0;
351
            }
352
            if (savehue < 0.0) {
353
                savehue += 360.0;
354
            }
355
            if (savehue < 60.0) {
356
                red = m1 + (m2 - m1) * savehue / 60.0;
357
            } else if (savehue < 180.0) {
358
                red = m2;
359
            } else if (savehue < 240.0) {
360
                red = m1 + (m2 - m1) * (240.0 - savehue) / 60.0;
361
            } else {
362
                red = m1;
363
            }
364

    
365
            savehue = hue;
366
            if (savehue > 360.0) {
367
                savehue -= 360.0;
368
            }
369
            if (savehue < 0.0) {
370
                savehue += 360.0;
371
            }
372
            if (savehue < 60.0) {
373
                green = m1 + (m2 - m1) * savehue / 60.0;
374
            } else if (savehue < 180.0) {
375
                green = m2;
376
            } else if (savehue < 240.0) {
377
                green = m1 + (m2 - m1) * (240.0 - savehue) / 60.0;
378
            } else {
379
                green = m1;
380
            }
381
            savehue = hue - 120.0;
382

    
383
            if (savehue > 360.0) {
384
                savehue -= 360.0;
385
            }
386
            if (savehue < 0.0) {
387
                savehue += 360.0;
388
            }
389
            if (savehue < 60.0) {
390
                blue = m1 + (m2 - m1) * savehue / 60.0;
391
            } else if (savehue < 180.0) {
392
                blue = m2;
393
            } else if (savehue < 240.0) {
394
                blue = m1 + (m2 - m1) * (240.0 - savehue) / 60.0;
395
            } else {
396
                blue = m1;
397
            }
398
        }
399

    
400
        red255 = red * 255.0;
401
        green255 = green * 255.0;
402
        blue255 = blue * 255.0;
403
        if (red255 > 255.0) {
404
            red = 255.0;
405
        } else {
406
            red = red255;
407
        }
408
        if (green255 > 255.0) {
409
            green = 255.0;
410
        } else {
411
            green = green255;
412
        }
413
        if (blue255 > 255.0) {
414
            blue = 255.0;
415
        } else {
416
            blue = blue255;
417
        }
418

    
419
        if (red > 254.5) {
420
            red = 254.5;
421
        }
422
        if (red < 0.0) {
423
            red = 0.0;
424
        }
425
        if (green > 254.5) {
426
            green = 254.5;
427
        }
428
        if (green < 0.0) {
429
            green = 0.0;
430
        }
431
        if (blue > 254.5) {
432
            blue = 254.5;
433
        }
434
        if (blue < 0.0) {
435
            blue = 0.0;
436
        }
437

    
438
        res[0] = (int) (red + 0.5);
439
        res[1] = (int) (green + 0.5);
440
        res[2] = (int) (blue + 0.5);
441
        return res;
442
    }
443

    
444
    public double[] RGBtoCMYK(int red, int green, int blue, double kScale) {
445
        double[] cmyk = new double[4];
446
        double r = red / 255D;
447
        double g = green / 255D;
448
        double b = blue / 255D;
449
        cmyk[3] = 1D - Math.max(r, Math.max(g, b));
450

    
451
        cmyk[0] = 0;
452
        cmyk[1] = 0;
453
        cmyk[2] = 0;
454
        if(cmyk[3]!=1){
455
            cmyk[0] = ((double) (1 - r - cmyk[3]) / (double) (1D - cmyk[3])) * kScale;
456
            cmyk[1] = ((double) (1 - g - cmyk[3]) / (double) (1D - cmyk[3])) * kScale;
457
            cmyk[2] = ((double) (1 - b - cmyk[3]) / (double) (1D - cmyk[3])) * kScale;
458
        }
459
        cmyk[3] *= kScale;
460
        return cmyk;
461
    }
462

    
463
    public double[] CMYKtoRGB(double cyan, double magenta, double yellow, double key) {
464
        double[] rgb = new double[3];
465

    
466
      rgb[0] = (1D - cyan)*(1-key);
467
      rgb[1] = (1D - magenta)*(1-key);
468
      rgb[2] = (1D - yellow)*(1-key);
469

    
470
        return rgb;
471
    }
472

    
473
    public double getLuminosity(int red, int green, int blue) {
474
        double   scaler, scaleg, scaleb;
475
        double   low, high;
476

    
477
        scaler = (double) (red / 255.0);
478
        scaleg = (double) (green / 255.0);
479
        scaleb = (double) (blue / 255.0);
480

    
481
        high = scaler;
482

    
483
        if (scaleg > high) {
484
            high = scaleg;
485
        }
486
        if (scaleb > high) {
487
            high = scaleb;
488
        }
489
        low = scaler;
490
        if (scaleg < low) {
491
            low = scaleg;
492
        }
493
        if (scaleb < low) {
494
            low = scaleb;
495
        }
496

    
497
        return ((high + low) / 2.0);
498
    }
499

    
500
    public byte[] getARGBFromIntToByteArray(int rgb) {
501
        byte[] b = new byte[4];
502
        b[0] = (byte) ((rgb & 0x00ff0000) >> 16);
503
        b[1] = (byte) ((rgb & 0x0000ff00) >> 8);
504
        b[2] = (byte) (rgb & 0x000000ff);
505
        b[3] = (byte) ((rgb & 0xff000000) >> 24);
506
        return b;
507
    }
508

    
509
    public int[] getARGBFromIntToIntArray(int rgb) {
510
        int[] i = new int[4];
511
        i[0] = (((rgb & 0x00ff0000) >> 16) & 0xff);
512
        i[1] = (((rgb & 0x0000ff00) >> 8) & 0xff);
513
        i[2] = ((rgb & 0x000000ff) & 0xff);
514
        i[3] = (((rgb & 0xff000000) >> 24) & 0xff);
515
        return i;
516
    }
517

    
518
    public int getIntFromARGB(int a, int r, int g, int b) {
519
        return (((a & 0xff) << 24) + ((r & 0xff) << 16) + ((g & 0xff) << 8) + (b & 0xff));
520
    }
521

    
522
}