/************************************************************************ filename: CEGUIcolour.h created: 20/8/2004 author: Paul D Turner (with code from Jeff Leigh) purpose: Defines interface to the colour class used to represent colour values within the system *************************************************************************/ /************************************************************************* Crazy Eddie's GUI System (http://www.cegui.org.uk) Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *************************************************************************/ #ifndef _CEGUIcolour_h_ #define _CEGUIcolour_h_ #include "CEGUIBase.h" // Start of CEGUI namespace section namespace CEGUI { typedef uint32 argb_t; //!< 32 bit ARGB representation of a colour. /*! \brief Class representing colour values within the system. */ class CEGUIEXPORT colour { public: /************************************************************************* Construction & Destruction *************************************************************************/ colour(void); colour(const colour& val); colour(float red, float green, float blue, float alpha = 1.0f); colour(argb_t argb); /************************************************************************* Accessors *************************************************************************/ argb_t getARGB(void) const { if (!d_argbValid) { d_argb = calculateARGB(); d_argbValid = true; } return d_argb; } float getAlpha(void) const {return d_alpha;} float getRed(void) const {return d_red;} float getGreen(void) const {return d_green;} float getBlue(void) const {return d_blue;} float getHue(void) const; float getSaturation(void) const; float getLumination(void) const; /************************************************************************* Manipulators *************************************************************************/ void setARGB(argb_t argb); inline void setAlpha(float alpha) { d_argbValid = false; d_alpha = alpha; } inline void setRed(float red) { d_argbValid = false; d_red = red; } inline void setGreen(float green) { d_argbValid = false; d_green = green; } inline void setBlue(float blue) { d_argbValid = false; d_blue = blue; } inline void set(float red, float green, float blue, float alpha = 1.0f) { d_argbValid = false; d_alpha = alpha; d_red = red; d_green = green; d_blue = blue; } inline void setRGB(float red, float green, float blue) { d_argbValid = false; d_red = red; d_green = green; d_blue = blue; } inline void setRGB(const colour& val) { d_red = val.d_red; d_green = val.d_green; d_blue = val.d_blue; if (d_argbValid) { d_argbValid = val.d_argbValid; if (d_argbValid) d_argb = (d_argb & 0xFF000000) | (val.d_argb & 0x00FFFFFF); } } void setHSL(float hue, float saturation, float luminance, float alpha = 1.0f); void invertColour(void); void invertColourWithAlpha(void); /************************************************************************* Operators *************************************************************************/ inline colour& operator=(argb_t val) { setARGB(val); return *this; } inline colour& operator=(const colour& val) { d_alpha = val.d_alpha; d_red = val.d_red; d_green = val.d_green; d_blue = val.d_blue; d_argb = val.d_argb; d_argbValid = val.d_argbValid; return *this; } inline colour& operator&=(argb_t val) { setARGB(getARGB() & val); return *this; } inline colour& operator&=(const colour& val) { setARGB(getARGB() & val.getARGB()); return *this; } inline colour& operator|=(argb_t val) { setARGB(getARGB() | val); return *this; } inline colour& operator|=(const colour& val) { setARGB(getARGB() | val.getARGB()); return *this; } inline colour& operator<<=(int val) { setARGB(getARGB() << val); return *this; } inline colour& operator>>=(int val) { setARGB(getARGB() >> val); return *this; } inline colour operator+(const colour& val) const { return colour( d_red + val.d_red, d_green + val.d_green, d_blue + val.d_blue, d_alpha + val.d_alpha ); } inline colour operator-(const colour& val) const { return colour( d_red - val.d_red, d_green - val.d_green, d_blue - val.d_blue, d_alpha - val.d_alpha ); } inline colour operator*(const float val) const { return colour( d_red * val, d_green * val, d_blue * val, d_alpha * val ); } inline colour& operator*=(const colour& val) { d_red *= val.d_red; d_blue *= val.d_blue; d_green *= val.d_green; d_alpha *= val.d_alpha; d_argbValid = false; return *this; } /************************************************************************* Compare operators *************************************************************************/ inline bool operator==(const colour& rhs) const { return d_red == rhs.d_red && d_green == rhs.d_green && d_blue == rhs.d_blue && d_alpha == rhs.d_alpha; } inline bool operator!=(const colour& rhs) const { return !(*this == rhs); } // // Conversion operators // operator argb_t() const {return getARGB();} private: /************************************************************************* Implementation Methods *************************************************************************/ /*! \brief calculate and return the ARGB value based on the current colour component values. */ argb_t calculateARGB(void) const; /************************************************************************* Implementation Data *************************************************************************/ float d_alpha, d_red, d_green, d_blue; //!< Colour components. mutable argb_t d_argb; //!< Colour as ARGB value. mutable bool d_argbValid; //!< True if argb value is valid. }; } // End of CEGUI namespace section #endif // end of guard _CEGUIcolour_h_