Blame Imath/ImathColor.h

Packit 8dc392
///////////////////////////////////////////////////////////////////////////
Packit 8dc392
//
Packit 8dc392
// Copyright (c) 2004-2012, Industrial Light & Magic, a division of Lucas
Packit 8dc392
// Digital Ltd. LLC
Packit 8dc392
// 
Packit 8dc392
// All rights reserved.
Packit 8dc392
// 
Packit 8dc392
// Redistribution and use in source and binary forms, with or without
Packit 8dc392
// modification, are permitted provided that the following conditions are
Packit 8dc392
// met:
Packit 8dc392
// *       Redistributions of source code must retain the above copyright
Packit 8dc392
// notice, this list of conditions and the following disclaimer.
Packit 8dc392
// *       Redistributions in binary form must reproduce the above
Packit 8dc392
// copyright notice, this list of conditions and the following disclaimer
Packit 8dc392
// in the documentation and/or other materials provided with the
Packit 8dc392
// distribution.
Packit 8dc392
// *       Neither the name of Industrial Light & Magic nor the names of
Packit 8dc392
// its contributors may be used to endorse or promote products derived
Packit 8dc392
// from this software without specific prior written permission. 
Packit 8dc392
// 
Packit 8dc392
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit 8dc392
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit 8dc392
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit 8dc392
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit 8dc392
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit 8dc392
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit 8dc392
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit 8dc392
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit 8dc392
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit 8dc392
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit 8dc392
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit 8dc392
//
Packit 8dc392
///////////////////////////////////////////////////////////////////////////
Packit 8dc392
Packit 8dc392
Packit 8dc392
Packit 8dc392
#ifndef INCLUDED_IMATHCOLOR_H
Packit 8dc392
#define INCLUDED_IMATHCOLOR_H
Packit 8dc392
Packit 8dc392
//----------------------------------------------------
Packit 8dc392
//
Packit 8dc392
//	A three and four component color class template.
Packit 8dc392
//
Packit 8dc392
//----------------------------------------------------
Packit 8dc392
Packit 8dc392
#include "ImathVec.h"
Packit 8dc392
#include "ImathNamespace.h"
Packit 8dc392
#include "half.h"
Packit 8dc392
Packit 8dc392
IMATH_INTERNAL_NAMESPACE_HEADER_ENTER
Packit 8dc392
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
class Color3: public Vec3 <T>
Packit 8dc392
{
Packit 8dc392
  public:
Packit 8dc392
Packit 8dc392
    //-------------
Packit 8dc392
    // Constructors
Packit 8dc392
    //-------------
Packit 8dc392
Packit 8dc392
    Color3 ();			// no initialization
Packit 8dc392
    explicit Color3 (T a);	// (a a a)
Packit 8dc392
    Color3 (T a, T b, T c);	// (a b c)
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //---------------------------------
Packit 8dc392
    // Copy constructors and assignment
Packit 8dc392
    //---------------------------------
Packit 8dc392
Packit 8dc392
    Color3 (const Color3 &c);
Packit 8dc392
    template <class S> Color3 (const Vec3<S> &v);
Packit 8dc392
Packit 8dc392
    const Color3 &	operator = (const Color3 &c);
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //------------------------
Packit 8dc392
    // Component-wise addition
Packit 8dc392
    //------------------------
Packit 8dc392
Packit 8dc392
    const Color3 &	operator += (const Color3 &c);
Packit 8dc392
    Color3		operator + (const Color3 &c) const;
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //---------------------------
Packit 8dc392
    // Component-wise subtraction
Packit 8dc392
    //---------------------------
Packit 8dc392
Packit 8dc392
    const Color3 &	operator -= (const Color3 &c);
Packit 8dc392
    Color3		operator - (const Color3 &c) const;
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //------------------------------------
Packit 8dc392
    // Component-wise multiplication by -1
Packit 8dc392
    //------------------------------------
Packit 8dc392
Packit 8dc392
    Color3		operator - () const;
Packit 8dc392
    const Color3 &	negate ();
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //------------------------------
Packit 8dc392
    // Component-wise multiplication
Packit 8dc392
    //------------------------------
Packit 8dc392
Packit 8dc392
    const Color3 &	operator *= (const Color3 &c);
Packit 8dc392
    const Color3 &	operator *= (T a);
Packit 8dc392
    Color3		operator * (const Color3 &c) const;
Packit 8dc392
    Color3		operator * (T a) const;
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //------------------------
Packit 8dc392
    // Component-wise division
Packit 8dc392
    //------------------------
Packit 8dc392
Packit 8dc392
    const Color3 &	operator /= (const Color3 &c);
Packit 8dc392
    const Color3 &	operator /= (T a);
Packit 8dc392
    Color3		operator / (const Color3 &c) const;
Packit 8dc392
    Color3		operator / (T a) const;
Packit 8dc392
};
Packit 8dc392
Packit 8dc392
template <class T> class Color4
Packit 8dc392
{
Packit 8dc392
  public:
Packit 8dc392
Packit 8dc392
    //-------------------
Packit 8dc392
    // Access to elements
Packit 8dc392
    //-------------------
Packit 8dc392
Packit 8dc392
    T			r, g, b, a;
Packit 8dc392
Packit 8dc392
    T &			operator [] (int i);
Packit 8dc392
    const T &		operator [] (int i) const;
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //-------------
Packit 8dc392
    // Constructors
Packit 8dc392
    //-------------
Packit 8dc392
Packit 8dc392
    Color4 ();			    	// no initialization
Packit 8dc392
    explicit Color4 (T a);		// (a a a a)
Packit 8dc392
    Color4 (T a, T b, T c, T d);	// (a b c d)
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //---------------------------------
Packit 8dc392
    // Copy constructors and assignment
Packit 8dc392
    //---------------------------------
Packit 8dc392
Packit 8dc392
    Color4 (const Color4 &v);
Packit 8dc392
    template <class S> Color4 (const Color4<S> &v);
Packit 8dc392
Packit 8dc392
    const Color4 &	operator = (const Color4 &v);
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //----------------------
Packit 8dc392
    // Compatibility with Sb
Packit 8dc392
    //----------------------
Packit 8dc392
Packit 8dc392
    template <class S>
Packit 8dc392
    void		setValue (S a, S b, S c, S d);
Packit 8dc392
Packit 8dc392
    template <class S>
Packit 8dc392
    void		setValue (const Color4<S> &v);
Packit 8dc392
Packit 8dc392
    template <class S>
Packit 8dc392
    void		getValue (S &a, S &b, S &c, S &d) const;
Packit 8dc392
Packit 8dc392
    template <class S>
Packit 8dc392
    void		getValue (Color4<S> &v) const;
Packit 8dc392
Packit 8dc392
    T *			getValue();
Packit 8dc392
    const T *		getValue() const;
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //---------
Packit 8dc392
    // Equality
Packit 8dc392
    //---------
Packit 8dc392
Packit 8dc392
    template <class S>
Packit 8dc392
    bool		operator == (const Color4<S> &v) const;
Packit 8dc392
Packit 8dc392
    template <class S>
Packit 8dc392
    bool		operator != (const Color4<S> &v) const;
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //------------------------
Packit 8dc392
    // Component-wise addition
Packit 8dc392
    //------------------------
Packit 8dc392
Packit 8dc392
    const Color4 &	operator += (const Color4 &v);
Packit 8dc392
    Color4		operator + (const Color4 &v) const;
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //---------------------------
Packit 8dc392
    // Component-wise subtraction
Packit 8dc392
    //---------------------------
Packit 8dc392
Packit 8dc392
    const Color4 &	operator -= (const Color4 &v);
Packit 8dc392
    Color4		operator - (const Color4 &v) const;
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //------------------------------------
Packit 8dc392
    // Component-wise multiplication by -1
Packit 8dc392
    //------------------------------------
Packit 8dc392
Packit 8dc392
    Color4		operator - () const;
Packit 8dc392
    const Color4 &	negate ();
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //------------------------------
Packit 8dc392
    // Component-wise multiplication
Packit 8dc392
    //------------------------------
Packit 8dc392
Packit 8dc392
    const Color4 &	operator *= (const Color4 &v);
Packit 8dc392
    const Color4 &	operator *= (T a);
Packit 8dc392
    Color4		operator * (const Color4 &v) const;
Packit 8dc392
    Color4		operator * (T a) const;
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //------------------------
Packit 8dc392
    // Component-wise division
Packit 8dc392
    //------------------------
Packit 8dc392
Packit 8dc392
    const Color4 &	operator /= (const Color4 &v);
Packit 8dc392
    const Color4 &	operator /= (T a);
Packit 8dc392
    Color4		operator / (const Color4 &v) const;
Packit 8dc392
    Color4		operator / (T a) const;
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //----------------------------------------------------------
Packit 8dc392
    // Number of dimensions, i.e. number of elements in a Color4
Packit 8dc392
    //----------------------------------------------------------
Packit 8dc392
Packit 8dc392
    static unsigned int	dimensions() {return 4;}
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //-------------------------------------------------
Packit 8dc392
    // Limitations of type T (see also class limits<T>)
Packit 8dc392
    //-------------------------------------------------
Packit 8dc392
Packit 8dc392
    static T		baseTypeMin()		{return limits<T>::min();}
Packit 8dc392
    static T		baseTypeMax()		{return limits<T>::max();}
Packit 8dc392
    static T		baseTypeSmallest()	{return limits<T>::smallest();}
Packit 8dc392
    static T		baseTypeEpsilon()	{return limits<T>::epsilon();}
Packit 8dc392
Packit 8dc392
Packit 8dc392
    //--------------------------------------------------------------
Packit 8dc392
    // Base type -- in templates, which accept a parameter, V, which
Packit 8dc392
    // could be a Color4<T>, you can refer to T as
Packit 8dc392
    // V::BaseType
Packit 8dc392
    //--------------------------------------------------------------
Packit 8dc392
Packit 8dc392
    typedef T		BaseType;
Packit 8dc392
};
Packit 8dc392
Packit 8dc392
//--------------
Packit 8dc392
// Stream output
Packit 8dc392
//--------------
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
std::ostream &	operator << (std::ostream &s, const Color4<T> &v);
Packit 8dc392
Packit 8dc392
//----------------------------------------------------
Packit 8dc392
// Reverse multiplication: S * Color4<T>
Packit 8dc392
//----------------------------------------------------
Packit 8dc392
Packit 8dc392
template <class S, class T> Color4<T>	operator * (S a, const Color4<T> &v);
Packit 8dc392
Packit 8dc392
//-------------------------
Packit 8dc392
// Typedefs for convenience
Packit 8dc392
//-------------------------
Packit 8dc392
Packit 8dc392
typedef Color3<float>		Color3f;
Packit 8dc392
typedef Color3<half>		Color3h;
Packit 8dc392
typedef Color3<unsigned char>	Color3c;
Packit 8dc392
typedef Color3<half>		C3h;
Packit 8dc392
typedef Color3<float>		C3f;
Packit 8dc392
typedef Color3<unsigned char>	C3c;
Packit 8dc392
typedef Color4<float>		Color4f;
Packit 8dc392
typedef Color4<half>		Color4h;
Packit 8dc392
typedef Color4<unsigned char>	Color4c;
Packit 8dc392
typedef Color4<float>		C4f;
Packit 8dc392
typedef Color4<half>		C4h;
Packit 8dc392
typedef Color4<unsigned char>	C4c;
Packit 8dc392
typedef unsigned int		PackedColor;
Packit 8dc392
Packit 8dc392
Packit 8dc392
//-------------------------
Packit 8dc392
// Implementation of Color3
Packit 8dc392
//-------------------------
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline
Packit 8dc392
Color3<T>::Color3 (): Vec3 <T> ()
Packit 8dc392
{
Packit 8dc392
    // empty
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline
Packit 8dc392
Color3<T>::Color3 (T a): Vec3 <T> (a)
Packit 8dc392
{
Packit 8dc392
    // empty
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline
Packit 8dc392
Color3<T>::Color3 (T a, T b, T c): Vec3 <T> (a, b, c)
Packit 8dc392
{
Packit 8dc392
    // empty
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline
Packit 8dc392
Color3<T>::Color3 (const Color3 &c): Vec3 <T> (c)
Packit 8dc392
{
Packit 8dc392
    // empty
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
template <class S>
Packit 8dc392
inline
Packit 8dc392
Color3<T>::Color3 (const Vec3<S> &v): Vec3 <T> (v)
Packit 8dc392
{
Packit 8dc392
    //empty
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const Color3<T> &
Packit 8dc392
Color3<T>::operator = (const Color3 &c)
Packit 8dc392
{
Packit 8dc392
    *((Vec3<T> *) this) = c;
Packit 8dc392
    return *this;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const Color3<T> &
Packit 8dc392
Color3<T>::operator += (const Color3 &c)
Packit 8dc392
{
Packit 8dc392
    *((Vec3<T> *) this) += c;
Packit 8dc392
    return *this;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline Color3<T>	
Packit 8dc392
Color3<T>::operator + (const Color3 &c) const
Packit 8dc392
{
Packit 8dc392
    return Color3 (*(Vec3<T> *)this + (const Vec3<T> &)c);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const Color3<T> &
Packit 8dc392
Color3<T>::operator -= (const Color3 &c)
Packit 8dc392
{
Packit 8dc392
    *((Vec3<T> *) this) -= c;
Packit 8dc392
    return *this;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline Color3<T>	
Packit 8dc392
Color3<T>::operator - (const Color3 &c) const
Packit 8dc392
{
Packit 8dc392
    return Color3 (*(Vec3<T> *)this - (const Vec3<T> &)c);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline Color3<T>	
Packit 8dc392
Color3<T>::operator - () const
Packit 8dc392
{
Packit 8dc392
    return Color3 (-(*(Vec3<T> *)this));
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const Color3<T> &
Packit 8dc392
Color3<T>::negate ()
Packit 8dc392
{
Packit 8dc392
    ((Vec3<T> *) this)->negate();
Packit 8dc392
    return *this;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const Color3<T> &
Packit 8dc392
Color3<T>::operator *= (const Color3 &c)
Packit 8dc392
{
Packit 8dc392
    *((Vec3<T> *) this) *= c;
Packit 8dc392
    return *this;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const Color3<T> &
Packit 8dc392
Color3<T>::operator *= (T a)
Packit 8dc392
{
Packit 8dc392
    *((Vec3<T> *) this) *= a;
Packit 8dc392
    return *this;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline Color3<T>	
Packit 8dc392
Color3<T>::operator * (const Color3 &c) const
Packit 8dc392
{
Packit 8dc392
    return Color3 (*(Vec3<T> *)this * (const Vec3<T> &)c);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline Color3<T>	
Packit 8dc392
Color3<T>::operator * (T a) const
Packit 8dc392
{
Packit 8dc392
    return Color3 (*(Vec3<T> *)this * a);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const Color3<T> &
Packit 8dc392
Color3<T>::operator /= (const Color3 &c)
Packit 8dc392
{
Packit 8dc392
    *((Vec3<T> *) this) /= c;
Packit 8dc392
    return *this;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const Color3<T> &
Packit 8dc392
Color3<T>::operator /= (T a)
Packit 8dc392
{
Packit 8dc392
    *((Vec3<T> *) this) /= a;
Packit 8dc392
    return *this;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline Color3<T>	
Packit 8dc392
Color3<T>::operator / (const Color3 &c) const
Packit 8dc392
{
Packit 8dc392
    return Color3 (*(Vec3<T> *)this / (const Vec3<T> &)c);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline Color3<T>	
Packit 8dc392
Color3<T>::operator / (T a) const
Packit 8dc392
{
Packit 8dc392
    return Color3 (*(Vec3<T> *)this / a);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
//-----------------------
Packit 8dc392
// Implementation of Color4
Packit 8dc392
//-----------------------
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline T &
Packit 8dc392
Color4<T>::operator [] (int i)
Packit 8dc392
{
Packit 8dc392
    return (&r)[i];
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const T &
Packit 8dc392
Color4<T>::operator [] (int i) const
Packit 8dc392
{
Packit 8dc392
    return (&r)[i];
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline
Packit 8dc392
Color4<T>::Color4 ()
Packit 8dc392
{
Packit 8dc392
    // empty
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline
Packit 8dc392
Color4<T>::Color4 (T x)
Packit 8dc392
{
Packit 8dc392
    r = g = b = a = x;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline
Packit 8dc392
Color4<T>::Color4 (T x, T y, T z, T w)
Packit 8dc392
{
Packit 8dc392
    r = x;
Packit 8dc392
    g = y;
Packit 8dc392
    b = z;
Packit 8dc392
    a = w;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline
Packit 8dc392
Color4<T>::Color4 (const Color4 &v)
Packit 8dc392
{
Packit 8dc392
    r = v.r;
Packit 8dc392
    g = v.g;
Packit 8dc392
    b = v.b;
Packit 8dc392
    a = v.a;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
template <class S>
Packit 8dc392
inline
Packit 8dc392
Color4<T>::Color4 (const Color4<S> &v)
Packit 8dc392
{
Packit 8dc392
    r = T (v.r);
Packit 8dc392
    g = T (v.g);
Packit 8dc392
    b = T (v.b);
Packit 8dc392
    a = T (v.a);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const Color4<T> &
Packit 8dc392
Color4<T>::operator = (const Color4 &v)
Packit 8dc392
{
Packit 8dc392
    r = v.r;
Packit 8dc392
    g = v.g;
Packit 8dc392
    b = v.b;
Packit 8dc392
    a = v.a;
Packit 8dc392
    return *this;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
template <class S>
Packit 8dc392
inline void
Packit 8dc392
Color4<T>::setValue (S x, S y, S z, S w)
Packit 8dc392
{
Packit 8dc392
    r = T (x);
Packit 8dc392
    g = T (y);
Packit 8dc392
    b = T (z);
Packit 8dc392
    a = T (w);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
template <class S>
Packit 8dc392
inline void
Packit 8dc392
Color4<T>::setValue (const Color4<S> &v)
Packit 8dc392
{
Packit 8dc392
    r = T (v.r);
Packit 8dc392
    g = T (v.g);
Packit 8dc392
    b = T (v.b);
Packit 8dc392
    a = T (v.a);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
template <class S>
Packit 8dc392
inline void
Packit 8dc392
Color4<T>::getValue (S &x, S &y, S &z, S &w) const
Packit 8dc392
{
Packit 8dc392
    x = S (r);
Packit 8dc392
    y = S (g);
Packit 8dc392
    z = S (b);
Packit 8dc392
    w = S (a);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
template <class S>
Packit 8dc392
inline void
Packit 8dc392
Color4<T>::getValue (Color4<S> &v) const
Packit 8dc392
{
Packit 8dc392
    v.r = S (r);
Packit 8dc392
    v.g = S (g);
Packit 8dc392
    v.b = S (b);
Packit 8dc392
    v.a = S (a);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline T *
Packit 8dc392
Color4<T>::getValue()
Packit 8dc392
{
Packit 8dc392
    return (T *) &r;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const T *
Packit 8dc392
Color4<T>::getValue() const
Packit 8dc392
{
Packit 8dc392
    return (const T *) &r;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
template <class S>
Packit 8dc392
inline bool
Packit 8dc392
Color4<T>::operator == (const Color4<S> &v) const
Packit 8dc392
{
Packit 8dc392
    return r == v.r && g == v.g && b == v.b && a == v.a;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
template <class S>
Packit 8dc392
inline bool
Packit 8dc392
Color4<T>::operator != (const Color4<S> &v) const
Packit 8dc392
{
Packit 8dc392
    return r != v.r || g != v.g || b != v.b || a != v.a;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const Color4<T> &
Packit 8dc392
Color4<T>::operator += (const Color4 &v)
Packit 8dc392
{
Packit 8dc392
    r += v.r;
Packit 8dc392
    g += v.g;
Packit 8dc392
    b += v.b;
Packit 8dc392
    a += v.a;
Packit 8dc392
    return *this;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline Color4<T>
Packit 8dc392
Color4<T>::operator + (const Color4 &v) const
Packit 8dc392
{
Packit 8dc392
    return Color4 (r + v.r, g + v.g, b + v.b, a + v.a);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const Color4<T> &
Packit 8dc392
Color4<T>::operator -= (const Color4 &v)
Packit 8dc392
{
Packit 8dc392
    r -= v.r;
Packit 8dc392
    g -= v.g;
Packit 8dc392
    b -= v.b;
Packit 8dc392
    a -= v.a;
Packit 8dc392
    return *this;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline Color4<T>
Packit 8dc392
Color4<T>::operator - (const Color4 &v) const
Packit 8dc392
{
Packit 8dc392
    return Color4 (r - v.r, g - v.g, b - v.b, a - v.a);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline Color4<T>
Packit 8dc392
Color4<T>::operator - () const
Packit 8dc392
{
Packit 8dc392
    return Color4 (-r, -g, -b, -a);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const Color4<T> &
Packit 8dc392
Color4<T>::negate ()
Packit 8dc392
{
Packit 8dc392
    r = -r;
Packit 8dc392
    g = -g;
Packit 8dc392
    b = -b;
Packit 8dc392
    a = -a;
Packit 8dc392
    return *this;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const Color4<T> &
Packit 8dc392
Color4<T>::operator *= (const Color4 &v)
Packit 8dc392
{
Packit 8dc392
    r *= v.r;
Packit 8dc392
    g *= v.g;
Packit 8dc392
    b *= v.b;
Packit 8dc392
    a *= v.a;
Packit 8dc392
    return *this;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const Color4<T> &
Packit 8dc392
Color4<T>::operator *= (T x)
Packit 8dc392
{
Packit 8dc392
    r *= x;
Packit 8dc392
    g *= x;
Packit 8dc392
    b *= x;
Packit 8dc392
    a *= x;
Packit 8dc392
    return *this;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline Color4<T>
Packit 8dc392
Color4<T>::operator * (const Color4 &v) const
Packit 8dc392
{
Packit 8dc392
    return Color4 (r * v.r, g * v.g, b * v.b, a * v.a);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline Color4<T>
Packit 8dc392
Color4<T>::operator * (T x) const
Packit 8dc392
{
Packit 8dc392
    return Color4 (r * x, g * x, b * x, a * x);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const Color4<T> &
Packit 8dc392
Color4<T>::operator /= (const Color4 &v)
Packit 8dc392
{
Packit 8dc392
    r /= v.r;
Packit 8dc392
    g /= v.g;
Packit 8dc392
    b /= v.b;
Packit 8dc392
    a /= v.a;
Packit 8dc392
    return *this;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline const Color4<T> &
Packit 8dc392
Color4<T>::operator /= (T x)
Packit 8dc392
{
Packit 8dc392
    r /= x;
Packit 8dc392
    g /= x;
Packit 8dc392
    b /= x;
Packit 8dc392
    a /= x;
Packit 8dc392
    return *this;
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline Color4<T>
Packit 8dc392
Color4<T>::operator / (const Color4 &v) const
Packit 8dc392
{
Packit 8dc392
    return Color4 (r / v.r, g / v.g, b / v.b, a / v.a);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
inline Color4<T>
Packit 8dc392
Color4<T>::operator / (T x) const
Packit 8dc392
{
Packit 8dc392
    return Color4 (r / x, g / x, b / x, a / x);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
Packit 8dc392
template <class T>
Packit 8dc392
std::ostream &
Packit 8dc392
operator << (std::ostream &s, const Color4<T> &v)
Packit 8dc392
{
Packit 8dc392
    return s << '(' << v.r << ' ' << v.g << ' ' << v.b << ' ' << v.a << ')';
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
//-----------------------------------------
Packit 8dc392
// Implementation of reverse multiplication
Packit 8dc392
//-----------------------------------------
Packit 8dc392
Packit 8dc392
template <class S, class T>
Packit 8dc392
inline Color4<T>
Packit 8dc392
operator * (S x, const Color4<T> &v)
Packit 8dc392
{
Packit 8dc392
    return Color4<T> (x * v.r, x * v.g, x * v.b, x * v.a);
Packit 8dc392
}
Packit 8dc392
Packit 8dc392
Packit 8dc392
IMATH_INTERNAL_NAMESPACE_HEADER_EXIT
Packit 8dc392
Packit 8dc392
#endif // INCLUDED_IMATHCOLOR_H