X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fcolor.h;fp=source%2Fcore%2Fcolor.h;h=e57689bffe559d8f411670f910cceaa2ed94ead0;hb=7aaec9a70b8d7733429bec043f8e33e02956f266;hp=0000000000000000000000000000000000000000;hpb=bec07999d95b76f4b47cffcc564d0cd0afc0435e;p=libs%2Fgl.git diff --git a/source/core/color.h b/source/core/color.h new file mode 100644 index 00000000..e57689bf --- /dev/null +++ b/source/core/color.h @@ -0,0 +1,35 @@ +#ifndef MSP_GL_COLOR_H_ +#define MSP_GL_COLOR_H_ + +#include + +namespace Msp { +namespace GL { + +inline float to_srgb(float c) +{ return (c<=0.0031308f ? 12.92f*c : 1.055f*std::pow(c, 1/2.4f)-0.055f); } + +inline float to_linear(float c) +{ return (c<=0.04045 ? c/12.92f : std::pow((c+0.055f)/1.055f, 2.4f)); } + +struct Color +{ + float r, g, b, a; + + Color(): r(1), g(1), b(1), a(1) { } + Color(float v): r(v), g(v), b(v), a(1) { } + Color(float r_, float g_, float b_): r(r_), g(g_), b(b_), a(1) { } + Color(float r_, float g_, float b_, float a_): r(r_), g(g_), b(b_), a(a_) { } + Color operator*(float f) const { return Color(r*f, g*f, b*f, a); } + Color operator+(const Color &c) const { return Color(r+c.r, g+c.g, b+c.b, 1-(1-a)*(1-c.a)); } + bool operator==(const Color &c) const { return (r==c.r && g==c.g && b==c.b && a==c.a); } + bool operator!=(const Color &c) const { return !operator==(c); } + + Color to_srgb() const { return Color(GL::to_srgb(r), GL::to_srgb(g), GL::to_srgb(b), a); } + Color to_linear() const { return Color(GL::to_linear(r), GL::to_linear(g), GL::to_linear(b), a); } +}; + +} // namespace GL +} // namespace Msp + +#endif