Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/3rdparty/openexr/Imath/ImathColor.h
16337 views
1
///////////////////////////////////////////////////////////////////////////
2
//
3
// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas
4
// Digital Ltd. LLC
5
//
6
// All rights reserved.
7
//
8
// Redistribution and use in source and binary forms, with or without
9
// modification, are permitted provided that the following conditions are
10
// met:
11
// * Redistributions of source code must retain the above copyright
12
// notice, this list of conditions and the following disclaimer.
13
// * Redistributions in binary form must reproduce the above
14
// copyright notice, this list of conditions and the following disclaimer
15
// in the documentation and/or other materials provided with the
16
// distribution.
17
// * Neither the name of Industrial Light & Magic nor the names of
18
// its contributors may be used to endorse or promote products derived
19
// from this software without specific prior written permission.
20
//
21
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
//
33
///////////////////////////////////////////////////////////////////////////
34
35
36
37
#ifndef INCLUDED_IMATHCOLOR_H
38
#define INCLUDED_IMATHCOLOR_H
39
40
//----------------------------------------------------
41
//
42
// A three and four component color class template.
43
//
44
//----------------------------------------------------
45
46
#include "ImathVec.h"
47
#include "half.h"
48
49
namespace Imath {
50
51
52
template <class T>
53
class Color3: public Vec3 <T>
54
{
55
public:
56
57
//-------------
58
// Constructors
59
//-------------
60
61
Color3 (); // no initialization
62
explicit Color3 (T a); // (a a a)
63
Color3 (T a, T b, T c); // (a b c)
64
65
66
//---------------------------------
67
// Copy constructors and assignment
68
//---------------------------------
69
70
Color3 (const Color3 &c);
71
template <class S> Color3 (const Vec3<S> &v);
72
73
const Color3 & operator = (const Color3 &c);
74
75
76
//------------------------
77
// Component-wise addition
78
//------------------------
79
80
const Color3 & operator += (const Color3 &c);
81
Color3 operator + (const Color3 &c) const;
82
83
84
//---------------------------
85
// Component-wise subtraction
86
//---------------------------
87
88
const Color3 & operator -= (const Color3 &c);
89
Color3 operator - (const Color3 &c) const;
90
91
92
//------------------------------------
93
// Component-wise multiplication by -1
94
//------------------------------------
95
96
Color3 operator - () const;
97
const Color3 & negate ();
98
99
100
//------------------------------
101
// Component-wise multiplication
102
//------------------------------
103
104
const Color3 & operator *= (const Color3 &c);
105
const Color3 & operator *= (T a);
106
Color3 operator * (const Color3 &c) const;
107
Color3 operator * (T a) const;
108
109
110
//------------------------
111
// Component-wise division
112
//------------------------
113
114
const Color3 & operator /= (const Color3 &c);
115
const Color3 & operator /= (T a);
116
Color3 operator / (const Color3 &c) const;
117
Color3 operator / (T a) const;
118
};
119
120
template <class T> class Color4
121
{
122
public:
123
124
//-------------------
125
// Access to elements
126
//-------------------
127
128
T r, g, b, a;
129
130
T & operator [] (int i);
131
const T & operator [] (int i) const;
132
133
134
//-------------
135
// Constructors
136
//-------------
137
138
Color4 (); // no initialization
139
explicit Color4 (T a); // (a a a a)
140
Color4 (T a, T b, T c, T d); // (a b c d)
141
142
143
//---------------------------------
144
// Copy constructors and assignment
145
//---------------------------------
146
147
Color4 (const Color4 &v);
148
template <class S> Color4 (const Color4<S> &v);
149
150
const Color4 & operator = (const Color4 &v);
151
152
153
//----------------------
154
// Compatibility with Sb
155
//----------------------
156
157
template <class S>
158
void setValue (S a, S b, S c, S d);
159
160
template <class S>
161
void setValue (const Color4<S> &v);
162
163
template <class S>
164
void getValue (S &a, S &b, S &c, S &d) const;
165
166
template <class S>
167
void getValue (Color4<S> &v) const;
168
169
T * getValue();
170
const T * getValue() const;
171
172
173
//---------
174
// Equality
175
//---------
176
177
template <class S>
178
bool operator == (const Color4<S> &v) const;
179
180
template <class S>
181
bool operator != (const Color4<S> &v) const;
182
183
184
//------------------------
185
// Component-wise addition
186
//------------------------
187
188
const Color4 & operator += (const Color4 &v);
189
Color4 operator + (const Color4 &v) const;
190
191
192
//---------------------------
193
// Component-wise subtraction
194
//---------------------------
195
196
const Color4 & operator -= (const Color4 &v);
197
Color4 operator - (const Color4 &v) const;
198
199
200
//------------------------------------
201
// Component-wise multiplication by -1
202
//------------------------------------
203
204
Color4 operator - () const;
205
const Color4 & negate ();
206
207
208
//------------------------------
209
// Component-wise multiplication
210
//------------------------------
211
212
const Color4 & operator *= (const Color4 &v);
213
const Color4 & operator *= (T a);
214
Color4 operator * (const Color4 &v) const;
215
Color4 operator * (T a) const;
216
217
218
//------------------------
219
// Component-wise division
220
//------------------------
221
222
const Color4 & operator /= (const Color4 &v);
223
const Color4 & operator /= (T a);
224
Color4 operator / (const Color4 &v) const;
225
Color4 operator / (T a) const;
226
227
228
//----------------------------------------------------------
229
// Number of dimensions, i.e. number of elements in a Color4
230
//----------------------------------------------------------
231
232
static unsigned int dimensions() {return 4;}
233
234
235
//-------------------------------------------------
236
// Limitations of type T (see also class limits<T>)
237
//-------------------------------------------------
238
239
static T baseTypeMin() {return limits<T>::min();}
240
static T baseTypeMax() {return limits<T>::max();}
241
static T baseTypeSmallest() {return limits<T>::smallest();}
242
static T baseTypeEpsilon() {return limits<T>::epsilon();}
243
244
245
//--------------------------------------------------------------
246
// Base type -- in templates, which accept a parameter, V, which
247
// could be a Color4<T>, you can refer to T as
248
// V::BaseType
249
//--------------------------------------------------------------
250
251
typedef T BaseType;
252
};
253
254
//--------------
255
// Stream output
256
//--------------
257
258
template <class T>
259
std::ostream & operator << (std::ostream &s, const Color4<T> &v);
260
261
//----------------------------------------------------
262
// Reverse multiplication: S * Color4<T>
263
//----------------------------------------------------
264
265
template <class S, class T> Color4<T> operator * (S a, const Color4<T> &v);
266
267
//-------------------------
268
// Typedefs for convenience
269
//-------------------------
270
271
typedef Color3<float> Color3f;
272
typedef Color3<half> Color3h;
273
typedef Color3<unsigned char> Color3c;
274
typedef Color3<half> C3h;
275
typedef Color3<float> C3f;
276
typedef Color3<unsigned char> C3c;
277
typedef Color4<float> Color4f;
278
typedef Color4<half> Color4h;
279
typedef Color4<unsigned char> Color4c;
280
typedef Color4<float> C4f;
281
typedef Color4<half> C4h;
282
typedef Color4<unsigned char> C4c;
283
typedef unsigned int PackedColor;
284
285
286
//-------------------------
287
// Implementation of Color3
288
//-------------------------
289
290
template <class T>
291
inline
292
Color3<T>::Color3 (): Vec3 <T> ()
293
{
294
// empty
295
}
296
297
template <class T>
298
inline
299
Color3<T>::Color3 (T a): Vec3 <T> (a)
300
{
301
// empty
302
}
303
304
template <class T>
305
inline
306
Color3<T>::Color3 (T a, T b, T c): Vec3 <T> (a, b, c)
307
{
308
// empty
309
}
310
311
template <class T>
312
inline
313
Color3<T>::Color3 (const Color3 &c): Vec3 <T> (c)
314
{
315
// empty
316
}
317
318
template <class T>
319
template <class S>
320
inline
321
Color3<T>::Color3 (const Vec3<S> &v): Vec3 <T> (v)
322
{
323
//empty
324
}
325
326
template <class T>
327
inline const Color3<T> &
328
Color3<T>::operator = (const Color3 &c)
329
{
330
*((Vec3<T> *) this) = c;
331
return *this;
332
}
333
334
template <class T>
335
inline const Color3<T> &
336
Color3<T>::operator += (const Color3 &c)
337
{
338
*((Vec3<T> *) this) += c;
339
return *this;
340
}
341
342
template <class T>
343
inline Color3<T>
344
Color3<T>::operator + (const Color3 &c) const
345
{
346
return Color3 (*(Vec3<T> *)this + (const Vec3<T> &)c);
347
}
348
349
template <class T>
350
inline const Color3<T> &
351
Color3<T>::operator -= (const Color3 &c)
352
{
353
*((Vec3<T> *) this) -= c;
354
return *this;
355
}
356
357
template <class T>
358
inline Color3<T>
359
Color3<T>::operator - (const Color3 &c) const
360
{
361
return Color3 (*(Vec3<T> *)this - (const Vec3<T> &)c);
362
}
363
364
template <class T>
365
inline Color3<T>
366
Color3<T>::operator - () const
367
{
368
return Color3 (-(*(Vec3<T> *)this));
369
}
370
371
template <class T>
372
inline const Color3<T> &
373
Color3<T>::negate ()
374
{
375
((Vec3<T> *) this)->negate();
376
return *this;
377
}
378
379
template <class T>
380
inline const Color3<T> &
381
Color3<T>::operator *= (const Color3 &c)
382
{
383
*((Vec3<T> *) this) *= c;
384
return *this;
385
}
386
387
template <class T>
388
inline const Color3<T> &
389
Color3<T>::operator *= (T a)
390
{
391
*((Vec3<T> *) this) *= a;
392
return *this;
393
}
394
395
template <class T>
396
inline Color3<T>
397
Color3<T>::operator * (const Color3 &c) const
398
{
399
return Color3 (*(Vec3<T> *)this * (const Vec3<T> &)c);
400
}
401
402
template <class T>
403
inline Color3<T>
404
Color3<T>::operator * (T a) const
405
{
406
return Color3 (*(Vec3<T> *)this * a);
407
}
408
409
template <class T>
410
inline const Color3<T> &
411
Color3<T>::operator /= (const Color3 &c)
412
{
413
*((Vec3<T> *) this) /= c;
414
return *this;
415
}
416
417
template <class T>
418
inline const Color3<T> &
419
Color3<T>::operator /= (T a)
420
{
421
*((Vec3<T> *) this) /= a;
422
return *this;
423
}
424
425
template <class T>
426
inline Color3<T>
427
Color3<T>::operator / (const Color3 &c) const
428
{
429
return Color3 (*(Vec3<T> *)this / (const Vec3<T> &)c);
430
}
431
432
template <class T>
433
inline Color3<T>
434
Color3<T>::operator / (T a) const
435
{
436
return Color3 (*(Vec3<T> *)this / a);
437
}
438
439
//-----------------------
440
// Implementation of Color4
441
//-----------------------
442
443
template <class T>
444
inline T &
445
Color4<T>::operator [] (int i)
446
{
447
return (&r)[i];
448
}
449
450
template <class T>
451
inline const T &
452
Color4<T>::operator [] (int i) const
453
{
454
return (&r)[i];
455
}
456
457
template <class T>
458
inline
459
Color4<T>::Color4 ()
460
{
461
// empty
462
}
463
464
template <class T>
465
inline
466
Color4<T>::Color4 (T x)
467
{
468
r = g = b = a = x;
469
}
470
471
template <class T>
472
inline
473
Color4<T>::Color4 (T x, T y, T z, T w)
474
{
475
r = x;
476
g = y;
477
b = z;
478
a = w;
479
}
480
481
template <class T>
482
inline
483
Color4<T>::Color4 (const Color4 &v)
484
{
485
r = v.r;
486
g = v.g;
487
b = v.b;
488
a = v.a;
489
}
490
491
template <class T>
492
template <class S>
493
inline
494
Color4<T>::Color4 (const Color4<S> &v)
495
{
496
r = T (v.r);
497
g = T (v.g);
498
b = T (v.b);
499
a = T (v.a);
500
}
501
502
template <class T>
503
inline const Color4<T> &
504
Color4<T>::operator = (const Color4 &v)
505
{
506
r = v.r;
507
g = v.g;
508
b = v.b;
509
a = v.a;
510
return *this;
511
}
512
513
template <class T>
514
template <class S>
515
inline void
516
Color4<T>::setValue (S x, S y, S z, S w)
517
{
518
r = T (x);
519
g = T (y);
520
b = T (z);
521
a = T (w);
522
}
523
524
template <class T>
525
template <class S>
526
inline void
527
Color4<T>::setValue (const Color4<S> &v)
528
{
529
r = T (v.r);
530
g = T (v.g);
531
b = T (v.b);
532
a = T (v.a);
533
}
534
535
template <class T>
536
template <class S>
537
inline void
538
Color4<T>::getValue (S &x, S &y, S &z, S &w) const
539
{
540
x = S (r);
541
y = S (g);
542
z = S (b);
543
w = S (a);
544
}
545
546
template <class T>
547
template <class S>
548
inline void
549
Color4<T>::getValue (Color4<S> &v) const
550
{
551
v.r = S (r);
552
v.g = S (g);
553
v.b = S (b);
554
v.a = S (a);
555
}
556
557
template <class T>
558
inline T *
559
Color4<T>::getValue()
560
{
561
return (T *) &r;
562
}
563
564
template <class T>
565
inline const T *
566
Color4<T>::getValue() const
567
{
568
return (const T *) &r;
569
}
570
571
template <class T>
572
template <class S>
573
inline bool
574
Color4<T>::operator == (const Color4<S> &v) const
575
{
576
return r == v.r && g == v.g && b == v.b && a == v.a;
577
}
578
579
template <class T>
580
template <class S>
581
inline bool
582
Color4<T>::operator != (const Color4<S> &v) const
583
{
584
return r != v.r || g != v.g || b != v.b || a != v.a;
585
}
586
587
template <class T>
588
inline const Color4<T> &
589
Color4<T>::operator += (const Color4 &v)
590
{
591
r += v.r;
592
g += v.g;
593
b += v.b;
594
a += v.a;
595
return *this;
596
}
597
598
template <class T>
599
inline Color4<T>
600
Color4<T>::operator + (const Color4 &v) const
601
{
602
return Color4 (r + v.r, g + v.g, b + v.b, a + v.a);
603
}
604
605
template <class T>
606
inline const Color4<T> &
607
Color4<T>::operator -= (const Color4 &v)
608
{
609
r -= v.r;
610
g -= v.g;
611
b -= v.b;
612
a -= v.a;
613
return *this;
614
}
615
616
template <class T>
617
inline Color4<T>
618
Color4<T>::operator - (const Color4 &v) const
619
{
620
return Color4 (r - v.r, g - v.g, b - v.b, a - v.a);
621
}
622
623
template <class T>
624
inline Color4<T>
625
Color4<T>::operator - () const
626
{
627
return Color4 (-r, -g, -b, -a);
628
}
629
630
template <class T>
631
inline const Color4<T> &
632
Color4<T>::negate ()
633
{
634
r = -r;
635
g = -g;
636
b = -b;
637
a = -a;
638
return *this;
639
}
640
641
template <class T>
642
inline const Color4<T> &
643
Color4<T>::operator *= (const Color4 &v)
644
{
645
r *= v.r;
646
g *= v.g;
647
b *= v.b;
648
a *= v.a;
649
return *this;
650
}
651
652
template <class T>
653
inline const Color4<T> &
654
Color4<T>::operator *= (T x)
655
{
656
r *= x;
657
g *= x;
658
b *= x;
659
a *= x;
660
return *this;
661
}
662
663
template <class T>
664
inline Color4<T>
665
Color4<T>::operator * (const Color4 &v) const
666
{
667
return Color4 (r * v.r, g * v.g, b * v.b, a * v.a);
668
}
669
670
template <class T>
671
inline Color4<T>
672
Color4<T>::operator * (T x) const
673
{
674
return Color4 (r * x, g * x, b * x, a * x);
675
}
676
677
template <class T>
678
inline const Color4<T> &
679
Color4<T>::operator /= (const Color4 &v)
680
{
681
r /= v.r;
682
g /= v.g;
683
b /= v.b;
684
a /= v.a;
685
return *this;
686
}
687
688
template <class T>
689
inline const Color4<T> &
690
Color4<T>::operator /= (T x)
691
{
692
r /= x;
693
g /= x;
694
b /= x;
695
a /= x;
696
return *this;
697
}
698
699
template <class T>
700
inline Color4<T>
701
Color4<T>::operator / (const Color4 &v) const
702
{
703
return Color4 (r / v.r, g / v.g, b / v.b, a / v.a);
704
}
705
706
template <class T>
707
inline Color4<T>
708
Color4<T>::operator / (T x) const
709
{
710
return Color4 (r / x, g / x, b / x, a / x);
711
}
712
713
714
template <class T>
715
std::ostream &
716
operator << (std::ostream &s, const Color4<T> &v)
717
{
718
return s << '(' << v.r << ' ' << v.g << ' ' << v.b << ' ' << v.a << ')';
719
}
720
721
//-----------------------------------------
722
// Implementation of reverse multiplication
723
//-----------------------------------------
724
725
template <class S, class T>
726
inline Color4<T>
727
operator * (S x, const Color4<T> &v)
728
{
729
return Color4<T> (x * v.r, x * v.g, x * v.b, x * v.a);
730
}
731
732
} // namespace Imath
733
734
#endif
735
736