/*
* Copyright 2010-2012 Inalogic® Inc.
*
* This program 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 or 3.0
* of the License.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranties of
* MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the applicable version of the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of both the GNU Lesser General Public
* License along with this program. If not, see
*
* Authored by: Jay Taoko
*
*/
#ifndef COLOR_H
#define COLOR_H
namespace nux
{
namespace color
{
// DirectX D3DFormat
//
// All formats are listed from left to right, most significant bit (MSB) to
// least significant bit (LSB). For example, D3DFORMAT_ARGB is ordered from
// the MSB channel A (alpha), to the LSB channel B (blue). When traversing
// surface data, the data is stored in memory from LSB to MSB, which means
// that the channel order in memory is from LSB (blue) to MSB (alpha).
//
// The default value for formats that contain undefined channels (G16R16,
// A8, and so on) is 1. The only exception is the A8 format, which is
// initialized to 000 for the three color channels.
//
// The order of the bits is from the most significant byte first, so
// D3DFMT_A8L8 indicates that the high byte of this 2-byte format is
// alpha. D3DFMT_D16 indicates a 16-bit integer value and an
// application-lockable surface.
//
// Pixel formats have been chosen to enable the expression of
// hardware-vendor-defined extension formats, as well as to include the
// well-established four-character code (FOURCC) method. The set of formats
// understood by the Microsoft Direct3D runtime is defined by D3DFORMAT.
//Format of RGBA colors is
//7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//| alpha | red | green | blue |
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//MSB 31 0 LSB
//Format of RGB colors is
//7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//| ignored | red | green | blue |
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//Format of BGR colors is
//7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//| ignored | blue | green | red |
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//Format of RGBA colors is
//7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//| red | green | blue | alpha |
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//Format of BGRA colors is
//7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//| blue | green | red | alpha |
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
enum Model
{
RGB,
HSV,
HLS,
YUV
};
enum Channel
{
RED,
GREEN,
BLUE,
HUE,
SATURATION,
LIGHT,
VALUE
};
enum Format
{
FLOAT,
HEX,
INT
};
class RedGreenBlue;
class Color
{
public:
Color();
explicit Color(unsigned int c);
Color(int r, int g, int b);
Color(float r, float g, float b, float a = 1.0f);
Color(RedGreenBlue const& rgb, float a = 1.0f);
//! Returns the pre-multiplied version of this color.
/*!
Returns the pre-multiplied version of this color. If this color is already pre-multiplied
then *this is returned.\n
The premultiplied color is Color(red * alpha, green * alpha, blue * alpha, alpha).
@return The pre-multiplied version of this color.
*/
Color GetPremultiplied();
//! Sets a pre-multiplied color
/*!
Sets a pre-multiplied color
@param r Red value.
@param g Green value.
@param b Blue value.
@param a Alpha value.
*/
void SetPremultiplied(float r, float g, float b, float a);
//! Returns True if this color is pre-multiplied.
/*!
Returns True if this color is pre-multiplied.
@return True is this color is pre-multiplied.
*/
bool IsPremultiplied();
float red;
float green;
float blue;
float alpha;
protected:
bool premultiplied_; //!< True if the rgb components have been pre-multiplied with the alpha component.
friend bool operator == (Color const& lhs, Color const& rhs);
};
bool operator == (Color const& lhs, Color const& rhs);
bool operator != (Color const& lhs, Color const& rhs);
Color operator + (Color const&, Color const&);
Color operator + (float, Color const&);
Color operator + (Color const&, float);
Color operator - (Color const&, Color const&);
Color operator - (float, Color const&);
Color operator - (Color const&, float);
Color operator * (float, Color const&);
Color operator * (Color const&, float);
Color RandomColor();
unsigned int RandomColorINT();
class HueSaturationValue;
class HueLightnessSaturation;
class RedGreenBlue
{
public:
RedGreenBlue(float r, float g, float b);
RedGreenBlue(HueSaturationValue const&);
RedGreenBlue(HueLightnessSaturation const&);
float red;
float green;
float blue;
};
class HueSaturationValue
{
public:
HueSaturationValue(float h, float s, float v);
HueSaturationValue(Color const&);
HueSaturationValue(RedGreenBlue const&);
float hue;
float saturation;
float value;
};
class HueLightnessSaturation
{
public:
HueLightnessSaturation(float h, float l, float s);
HueLightnessSaturation(Color const&);
HueLightnessSaturation(RedGreenBlue const&);
float hue;
float lightness;
float saturation;
};
}
using color::Color;
}
#endif // COLOR_H