// ------------------------------------------------------------------------------------------------ #include "Base/Color3.hpp" #include "Base/Color4.hpp" #include "Base/Shared.hpp" #include "Library/Random.hpp" // ------------------------------------------------------------------------------------------------ namespace SqMod { // ------------------------------------------------------------------------------------------------ const Color3 Color3::NIL = Color3(); const Color3 Color3::MIN = Color3(NumLimit< Color3::Value >::Min); const Color3 Color3::MAX = Color3(NumLimit< Color3::Value >::Max); // ------------------------------------------------------------------------------------------------ SQChar Color3::Delim = ','; // ------------------------------------------------------------------------------------------------ Color3::Color3() : r(0), g(0), b(0) { /* ... */ } // ------------------------------------------------------------------------------------------------ Color3::Color3(Value sv) : r(sv), g(sv), b(sv) { /* ... */ } // ------------------------------------------------------------------------------------------------ Color3::Color3(Value rv, Value gv, Value bv) : r(rv), g(gv), b(bv) { /* ... */ } // ------------------------------------------------------------------------------------------------ Color3::Color3(const Color3 & o) : r(o.r), g(o.g), b(o.b) { /* ... */ } // ------------------------------------------------------------------------------------------------ Color3::~Color3() { /* ... */ } // ------------------------------------------------------------------------------------------------ Color3 & Color3::operator = (const Color3 & o) { r = o.r; g = o.g; b = o.b; return *this; } // ------------------------------------------------------------------------------------------------ Color3 & Color3::operator = (Value s) { r = s; g = s; b = s; return *this; } Color3 & Color3::operator = (CSStr name) { Set(GetColor(name)); return *this; } Color3 & Color3::operator = (const Color4 & c) { r = c.r; g = c.g; b = c.b; return *this; } // ------------------------------------------------------------------------------------------------ Color3 & Color3::operator += (const Color3 & c) { r += c.r; g += c.g; b += c.b; return *this; } Color3 & Color3::operator -= (const Color3 & c) { r -= c.r; g -= c.g; b -= c.b; return *this; } Color3 & Color3::operator *= (const Color3 & c) { r *= c.r; g *= c.g; b *= c.b; return *this; } Color3 & Color3::operator /= (const Color3 & c) { r /= c.r; g /= c.g; b /= c.b; return *this; } Color3 & Color3::operator %= (const Color3 & c) { r %= c.r; g %= c.g; b %= c.b; return *this; } Color3 & Color3::operator &= (const Color3 & c) { r &= c.r; g &= c.g; b &= c.b; return *this; } Color3 & Color3::operator |= (const Color3 & c) { r |= c.r; g |= c.g; b |= c.b; return *this; } Color3 & Color3::operator ^= (const Color3 & c) { r ^= c.r; g ^= c.g; b ^= c.b; return *this; } Color3 & Color3::operator <<= (const Color3 & c) { r <<= c.r; g <<= c.g; b <<= c.b; return *this; } Color3 & Color3::operator >>= (const Color3 & c) { r >>= c.r; g >>= c.g; b >>= c.b; return *this; } // ------------------------------------------------------------------------------------------------ Color3 & Color3::operator += (Value s) { r += s; g += s; b += s; return *this; } Color3 & Color3::operator -= (Value s) { r -= s; g -= s; b -= s; return *this; } Color3 & Color3::operator *= (Value s) { r *= s; g *= s; b *= s; return *this; } Color3 & Color3::operator /= (Value s) { r /= s; g /= s; b /= s; return *this; } Color3 & Color3::operator %= (Value s) { r %= s; g %= s; b %= s; return *this; } Color3 & Color3::operator &= (Value s) { r &= s; g &= s; b &= s; return *this; } Color3 & Color3::operator |= (Value s) { r |= s; g |= s; b |= s; return *this; } Color3 & Color3::operator ^= (Value s) { r ^= s; g ^= s; b ^= s; return *this; } Color3 & Color3::operator <<= (Value s) { r <<= s; g <<= s; b <<= s; return *this; } Color3 & Color3::operator >>= (Value s) { r >>= s; g >>= s; b >>= s; return *this; } // ------------------------------------------------------------------------------------------------ Color3 & Color3::operator ++ () { ++r; ++g; ++b; return *this; } Color3 & Color3::operator -- () { --r; --g; --b; return *this; } // ------------------------------------------------------------------------------------------------ Color3 Color3::operator ++ (int) { Color3 state(*this); ++r; ++g; ++b; return state; } Color3 Color3::operator -- (int) { Color3 state(*this); --r; --g; --b; return state; } // ------------------------------------------------------------------------------------------------ Color3 Color3::operator + (const Color3 & c) const { return Color3(r + c.r, g + c.g, b + c.b); } Color3 Color3::operator - (const Color3 & c) const { return Color3(r - c.r, g - c.g, b - c.b); } Color3 Color3::operator * (const Color3 & c) const { return Color3(r * c.r, g * c.g, b * c.b); } Color3 Color3::operator / (const Color3 & c) const { return Color3(r / c.r, g / c.g, b / c.b); } Color3 Color3::operator % (const Color3 & c) const { return Color3(r % c.r, g % c.g, b % c.b); } Color3 Color3::operator & (const Color3 & c) const { return Color3(r & c.r, g & c.g, b & c.b); } Color3 Color3::operator | (const Color3 & c) const { return Color3(r | c.r, g | c.g, b | c.b); } Color3 Color3::operator ^ (const Color3 & c) const { return Color3(r ^ c.r, g ^ c.g, b ^ c.b); } Color3 Color3::operator << (const Color3 & c) const { return Color3(r << c.r, g << c.g, b << c.b); } Color3 Color3::operator >> (const Color3 & c) const { return Color3(r >> c.r, g >> c.g, b >> c.b); } // ------------------------------------------------------------------------------------------------ Color3 Color3::operator + (Value s) const { return Color3(r + s, g + s, b + s); } Color3 Color3::operator - (Value s) const { return Color3(r - s, g - s, b - s); } Color3 Color3::operator * (Value s) const { return Color3(r * s, g * s, b * s); } Color3 Color3::operator / (Value s) const { return Color3(r / s, g / s, b / s); } Color3 Color3::operator % (Value s) const { return Color3(r % s, g % s, b % s); } Color3 Color3::operator & (Value s) const { return Color3(r & s, g & s, b & s); } Color3 Color3::operator | (Value s) const { return Color3(r | s, g | s, b | s); } Color3 Color3::operator ^ (Value s) const { return Color3(r ^ s, g ^ s, b ^ s); } Color3 Color3::operator << (Value s) const { return Color3(r << s, g << s, b << s); } Color3 Color3::operator >> (Value s) const { return Color3(r >> s, g >> s, b >> s); } // ------------------------------------------------------------------------------------------------ Color3 Color3::operator + () const { return Color3(r, g, b); } Color3 Color3::operator - () const { return Color3(0, 0, 0); } // ------------------------------------------------------------------------------------------------ Color3 Color3::operator ~ () const { return Color3(~r, ~g, ~b); } // ------------------------------------------------------------------------------------------------ bool Color3::operator == (const Color3 & c) const { return (r == c.r) && (g == c.g) && (b == c.b); } bool Color3::operator != (const Color3 & c) const { return (r != c.r) && (g != c.g) && (b != c.b); } bool Color3::operator < (const Color3 & c) const { return (r < c.r) && (g < c.g) && (b < c.b); } bool Color3::operator > (const Color3 & c) const { return (r > c.r) && (g > c.g) && (b > c.b); } bool Color3::operator <= (const Color3 & c) const { return (r <= c.r) && (g <= c.g) && (b <= c.b); } bool Color3::operator >= (const Color3 & c) const { return (r >= c.r) && (g >= c.g) && (b >= c.b); } // ------------------------------------------------------------------------------------------------ Color3::operator Color4 () const { return Color4(r, g, b); } // ------------------------------------------------------------------------------------------------ Int32 Color3::Cmp(const Color3 & o) const { if (*this == o) return 0; else if (*this > o) return 1; else return -1; } // ------------------------------------------------------------------------------------------------ CSStr Color3::ToString() const { return ToStringF("%u,%u,%u", r, g, b); } // ------------------------------------------------------------------------------------------------ void Color3::Set(Value ns) { r = ns; g = ns; b = ns; } void Color3::Set(Value nr, Value ng, Value nb) { r = nr; g = ng; b = nb; } // ------------------------------------------------------------------------------------------------ void Color3::Set(const Color3 & c) { r = c.r; g = c.g; b = c.b; } void Color3::Set(const Color4 & c) { r = c.r; g = c.g; b = c.b; } // ------------------------------------------------------------------------------------------------ void Color3::Set(CSStr str, SQChar delim) { Set(GetColor3(str, delim)); } // ------------------------------------------------------------------------------------------------ void Color3::SetCol(CSStr name) { Set(GetColor(name)); } // ------------------------------------------------------------------------------------------------ Uint32 Color3::GetRGB() const { return Uint32(r << 16 | g << 8 | b); } void Color3::SetRGB(Uint32 p) { r = Value((p >> 16) & 0xFF); g = Value((p >> 8) & 0xFF); b = Value((p) & 0xFF); } // ------------------------------------------------------------------------------------------------ Uint32 Color3::GetRGBA() const { return Uint32(r << 24 | g << 16 | b << 8 | 0x00); } void Color3::SetRGBA(Uint32 p) { r = Value((p >> 24) & 0xFF); g = Value((p >> 16) & 0xFF); b = Value((p >> 8) & 0xFF); } // ------------------------------------------------------------------------------------------------ Uint32 Color3::GetARGB() const { return Uint32(0x00 << 24 | r << 16 | g << 8 | b); } void Color3::SetARGB(Uint32 p) { r = Value((p >> 16) & 0xFF); g = Value((p >> 8) & 0xFF); b = Value((p) & 0xFF); } // ------------------------------------------------------------------------------------------------ void Color3::Generate() { r = GetRandomUint8(); g = GetRandomUint8(); b = GetRandomUint8(); } void Color3::Generate(Value min, Value max) { if (max < min) { SqThrow("max value is lower than min value"); } else { r = GetRandomUint8(min, max); g = GetRandomUint8(min, max); b = GetRandomUint8(min, max); } } void Color3::Generate(Value rmin, Value rmax, Value gmin, Value gmax, Value bmin, Value bmax) { if (rmax < rmin || gmax < gmin || bmax < bmin) { SqThrow("max value is lower than min value"); } else { r = GetRandomUint8(rmin, rmax); g = GetRandomUint8(gmin, gmax); b = GetRandomUint8(bmin, bmax); } } // ------------------------------------------------------------------------------------------------ void Color3::Random() { Set(GetRandomColor()); } // ------------------------------------------------------------------------------------------------ void Color3::Inverse() { r = Value(~r); g = Value(~g); b = Value(~b); } // ================================================================================================ void Register_Color3(HSQUIRRELVM vm) { typedef Color3::Value Val; RootTable(vm).Bind(_SC("Color3"), Class< Color3 >(vm, _SC("Color3")) /* Constructors */ .Ctor() .Ctor< Val >() .Ctor< Val, Val, Val >() /* Static Members */ .SetStaticValue(_SC("Delim"), &Color3::Delim) /* Member Variables */ .Var(_SC("r"), &Color3::r) .Var(_SC("g"), &Color3::g) .Var(_SC("b"), &Color3::b) /* Properties */ .Prop(_SC("rgb"), &Color3::GetRGB, &Color3::SetRGB) .Prop(_SC("rgba"), &Color3::GetRGBA, &Color3::SetRGBA) .Prop(_SC("argb"), &Color3::GetARGB, &Color3::SetARGB) .Prop(_SC("str"), &Color3::SetCol) /* Core Metamethods */ .Func(_SC("_tostring"), &Color3::ToString) .Func(_SC("_cmp"), &Color3::Cmp) /* Metamethods */ .Func(_SC("_add"), &Color3::operator +) .Func(_SC("_sub"), &Color3::operator -) .Func(_SC("_mul"), &Color3::operator *) .Func(_SC("_div"), &Color3::operator /) .Func(_SC("_modulo"), &Color3::operator %) .Func(_SC("_unm"), &Color3::operator -) /* Setters */ .Overload(_SC("Set"), &Color3::Set) .Overload(_SC("Set"), &Color3::Set) .Overload(_SC("SetCol3"), &Color3::Set) .Overload(_SC("SetCol4"), &Color3::Set) .Overload(_SC("SetStr"), &Color3::Set) /* Random Generators */ .Overload(_SC("Generate"), &Color3::Generate) .Overload(_SC("Generate"), &Color3::Generate) .Overload(_SC("Generate"), &Color3::Generate) /* Utility Methods */ .Func(_SC("Clear"), &Color3::Clear) .Func(_SC("Random"), &Color3::Random) .Func(_SC("Inverse"), &Color3::Inverse) /* Operator Exposure */ .Func(_SC("opAddAssign"), &Color3::operator +=) .Func(_SC("opSubAssign"), &Color3::operator -=) .Func(_SC("opMulAssign"), &Color3::operator *=) .Func(_SC("opDivAssign"), &Color3::operator /=) .Func(_SC("opModAssign"), &Color3::operator %=) .Func(_SC("opAndAssign"), &Color3::operator &=) .Func(_SC("opOrAssign"), &Color3::operator |=) .Func(_SC("opXorAssign"), &Color3::operator ^=) .Func(_SC("opShlAssign"), &Color3::operator <<=) .Func(_SC("opShrAssign"), &Color3::operator >>=) .Func(_SC("opAddAssignS"), &Color3::operator +=) .Func(_SC("opSubAssignS"), &Color3::operator -=) .Func(_SC("opMulAssignS"), &Color3::operator *=) .Func(_SC("opDivAssignS"), &Color3::operator /=) .Func(_SC("opModAssignS"), &Color3::operator %=) .Func(_SC("opAndAssignS"), &Color3::operator &=) .Func(_SC("opOrAssignS"), &Color3::operator |=) .Func(_SC("opXorAssignS"), &Color3::operator ^=) .Func(_SC("opShlAssignS"), &Color3::operator <<=) .Func(_SC("opShrAssignS"), &Color3::operator >>=) .Func(_SC("opPreInc"), &Color3::operator ++) .Func(_SC("opPreDec"), &Color3::operator --) .Func(_SC("opPostInc"), &Color3::operator ++) .Func(_SC("opPostDec"), &Color3::operator --) .Func(_SC("opAdd"), &Color3::operator +) .Func(_SC("opSub"), &Color3::operator -) .Func(_SC("opMul"), &Color3::operator *) .Func(_SC("opDiv"), &Color3::operator /) .Func(_SC("opMod"), &Color3::operator %) .Func(_SC("opAnd"), &Color3::operator &) .Func(_SC("opOr"), &Color3::operator |) .Func(_SC("opShl"), &Color3::operator ^) .Func(_SC("opShl"), &Color3::operator <<) .Func(_SC("opShr"), &Color3::operator >>) .Func(_SC("opAddS"), &Color3::operator +) .Func(_SC("opSubS"), &Color3::operator -) .Func(_SC("opMulS"), &Color3::operator *) .Func(_SC("opDivS"), &Color3::operator /) .Func(_SC("opModS"), &Color3::operator %) .Func(_SC("opAndS"), &Color3::operator &) .Func(_SC("opOrS"), &Color3::operator |) .Func(_SC("opShlS"), &Color3::operator ^) .Func(_SC("opShlS"), &Color3::operator <<) .Func(_SC("opShrS"), &Color3::operator >>) .Func(_SC("opUnPlus"), &Color3::operator +) .Func(_SC("opUnMinus"), &Color3::operator -) .Func(_SC("opCom"), &Color3::operator ~) .Func(_SC("opEqual"), &Color3::operator ==) .Func(_SC("opNotEqual"), &Color3::operator !=) .Func(_SC("opLessThan"), &Color3::operator <) .Func(_SC("opGreaterThan"), &Color3::operator >) .Func(_SC("opLessEqual"), &Color3::operator <=) .Func(_SC("opGreaterEqual"), &Color3::operator >=) ); } } // Namespace:: SqMod