Update to 2.0.0 tree from current Fremantle build
[opencv] / 3rdparty / include / OpenEXR / ImathColor.h
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