#pragma once namespace Javelin { template class ColorRgb { public: T b; T g; T r; ColorRgb() : r(0) , g(0) , b(0) { } ColorRgb(T red, T green, T blue) : r(red) , g(green) , b(blue) { } ColorRgb(const ColorRgb &x) : r(x.r) , g(x.g) , b(x.b) { } ColorRgb operator *(int x) { return ColorRgb(r * x, g * x, b * x); } ColorRgb operator +(const ColorRgb &x) const { return ColorRgb(r + (int)x.r, g + (int)x.g, b + (int)x.b); } ColorRgb operator -(const ColorRgb &x) const { return ColorRgb(r - (int)x.r, g - (int)x.g, b - (int)x.b); } int operator %(const ColorRgb &x) const { return r * (int)x.r + g * (int)x.g + b * (int)x.b; } bool operator ==(const ColorRgb &x) const { return r == x.r && g == x.g && b == x.b; } bool operator !=(const ColorRgb &x) const { return r != x.r || g != x.g || b != x.b; } void SetMin(const ColorRgb &x) { if (x.r < r) { r = x.r; } if (x.g < g) { g = x.g; } if (x.b < b) { b = x.b; } } void SetMax(const ColorRgb &x) { if (x.r > r) { r = x.r; } if (x.g > g) { g = x.g; } if (x.b > b) { b = x.b; } } }; template class ColorRgba : public ColorRgb { public: T a; ColorRgba() : a(0) { } ColorRgba(T red, T green, T blue, T alpha) : ColorRgb(red, green, blue) , a(alpha) { } ColorRgba(const ColorRgba &x) : ColorRgb(x.r, x.g, x.b) , a(x.a) { } ColorRgba operator *(int x) { return ColorRgba(ColorRgb::r * x, ColorRgb::g * x, ColorRgb::b * x, a * x); } ColorRgba operator +(const ColorRgba &x) { return ColorRgba(ColorRgb::r + (int)x.r, ColorRgb::g + (int)x.g, ColorRgb::b + (int)x.b, a + (int)x.a); } ColorRgba operator -(const ColorRgba &x) { return ColorRgba(ColorRgb::r - (int)x.r, ColorRgb::g - (int)x.g, ColorRgb::b - (int)x.b, a - (int)x.a); } int operator %(const ColorRgba &x) { return ColorRgb::r * (int)x.r + ColorRgb::g * (int)x.g + ColorRgb::b * (int)x.b + a * (int)x.a; } bool operator ==(const ColorRgba &x) { return ColorRgb::r == x.r && ColorRgb::g == x.g && ColorRgb::b == x.b && a == x.a; } bool operator !=(const ColorRgba &x) { return ColorRgb::r != x.r || ColorRgb::g != x.g || ColorRgb::b != x.b || a != x.a; } void SetMin(const ColorRgba &x) { ColorRgb::SetMin(x); if (x.a < a) { a = x.a; } } void SetMax(const ColorRgba &x) { ColorRgb::SetMax(x); if (x.a > a) { a = x.a; } } }; }