// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef sw_Color_hpp
#define sw_Color_hpp

#include "System/Math.hpp"
#include "System/Types.hpp"

namespace sw {

template<class T>
struct Color
{
	Color();

	Color(const Color<byte> &c);
	Color(const Color<short> &c);
	Color(const Color<float> &c);

	Color(int c);
	Color(unsigned short c);
	Color(unsigned long c);
	Color(unsigned int c);

	Color(T r, T g, T b, T a = 1);

	operator unsigned int() const;

	T &operator[](int i);
	const T &operator[](int i) const;

	Color<T> operator+() const;
	Color<T> operator-() const;

	Color<T> &operator=(const Color<T> &c);

	Color<T> &operator+=(const Color<T> &c);
	Color<T> &operator*=(float l);

	static Color<T> gradient(const Color<T> &c1, const Color<T> &c2, float d);
	static Color<T> shade(const Color<T> &c1, const Color<T> &c2, float d);

	template<class S>
	friend Color<S> operator+(const Color<S> &c1, const Color<S> &c2);
	template<class S>
	friend Color<S> operator-(const Color<S> &c1, const Color<S> &c2);

	template<class S>
	friend Color<S> operator*(float l, const Color<S> &c);
	template<class S>
	friend Color<S> operator*(const Color<S> &c1, const Color<S> &c2);
	template<class S>
	friend Color<S> operator/(const Color<S> &c, float l);

	T r;
	T g;
	T b;
	T a;
};
}  // namespace sw

#include "System/Math.hpp"

namespace sw {

template<class T>
inline Color<T>::Color()
{
}

template<>
inline Color<byte>::Color(const Color<byte> &c)
{
	r = c.r;
	g = c.g;
	b = c.b;
	a = c.a;
}

template<>
inline Color<byte>::Color(const Color<short> &c)
{
	r = static_cast<byte>(clamp(c.r >> 4, 0, 255));
	g = static_cast<byte>(clamp(c.g >> 4, 0, 255));
	b = static_cast<byte>(clamp(c.b >> 4, 0, 255));
	a = static_cast<byte>(clamp(c.a >> 4, 0, 255));
}

template<>
inline Color<byte>::Color(const Color<float> &c)
{
	r = static_cast<byte>(ifloor(clamp(c.r * 256.0f, 0.0f, 255.0f)));
	g = static_cast<byte>(ifloor(clamp(c.g * 256.0f, 0.0f, 255.0f)));
	b = static_cast<byte>(ifloor(clamp(c.b * 256.0f, 0.0f, 255.0f)));
	a = static_cast<byte>(ifloor(clamp(c.a * 256.0f, 0.0f, 255.0f)));
}

template<>
inline Color<short>::Color(const Color<short> &c)
{
	r = c.r;
	g = c.g;
	b = c.b;
	a = c.a;
}

template<>
inline Color<short>::Color(const Color<byte> &c)
{
	r = c.r << 4;
	g = c.g << 4;
	b = c.b << 4;
	a = c.a << 4;
}

template<>
inline Color<float>::Color(const Color<float> &c)
{
	r = c.r;
	g = c.g;
	b = c.b;
	a = c.a;
}

template<>
inline Color<short>::Color(const Color<float> &c)
{
	r = static_cast<short>(iround(clamp(c.r * 4095.0f, -4096.0f, 4095.0f)));
	g = static_cast<short>(iround(clamp(c.g * 4095.0f, -4096.0f, 4095.0f)));
	b = static_cast<short>(iround(clamp(c.b * 4095.0f, -4096.0f, 4095.0f)));
	a = static_cast<short>(iround(clamp(c.a * 4095.0f, -4096.0f, 4095.0f)));
}

template<>
inline Color<float>::Color(const Color<byte> &c)
{
	r = c.r / 255.0f;
	g = c.g / 255.0f;
	b = c.b / 255.0f;
	a = c.a / 255.0f;
}

template<>
inline Color<float>::Color(const Color<short> &c)
{
	r = c.r / 4095.0f;
	g = c.g / 4095.0f;
	b = c.b / 4095.0f;
	a = c.a / 4095.0f;
}

template<>
inline Color<float>::Color(unsigned short c)
{
	r = (float)(c & 0xF800) / (float)0xF800;
	g = (float)(c & 0x07E0) / (float)0x07E0;
	b = (float)(c & 0x001F) / (float)0x001F;
	a = 1;
}

template<>
inline Color<short>::Color(unsigned short c)
{
	// 4.12 fixed-point format
	r = ((c & 0xF800) >> 4) + ((c & 0xF800) >> 9) + ((c & 0xF800) >> 14);
	g = ((c & 0x07E0) << 1) + ((c & 0x07E0) >> 5);
	b = ((c & 0x001F) << 7) + ((c & 0x001F) << 2) + ((c & 0x001F) >> 3);
	a = 0x1000;
}

template<>
inline Color<byte>::Color(unsigned short c)
{
	r = (byte)(((c & 0xF800) >> 8) + ((c & 0xE000) >> 13));
	g = (byte)(((c & 0x07E0) >> 3) + ((c & 0x0600) >> 9));
	b = (byte)(((c & 0x001F) << 3) + ((c & 0x001C) >> 2));
	a = 0xFF;
}

template<>
inline Color<float>::Color(int c)
{
	const float d = 1.0f / 255.0f;

	r = (float)((c & 0x00FF0000) >> 16) * d;
	g = (float)((c & 0x0000FF00) >> 8) * d;
	b = (float)((c & 0x000000FF) >> 0) * d;
	a = (float)((c & 0xFF000000) >> 24) * d;
}

template<>
inline Color<short>::Color(int c)
{
	// 4.12 fixed-point format
	r = (short)((c & 0x00FF0000) >> 12);
	g = (short)((c & 0x0000FF00) >> 4);
	b = (short)((c & 0x000000FF) << 4);
	a = (short)((c & 0xFF000000) >> 20);
}

template<>
inline Color<byte>::Color(int c)
{
	r = (byte)((c & 0x00FF0000) >> 16);
	g = (byte)((c & 0x0000FF00) >> 8);
	b = (byte)((c & 0x000000FF) >> 0);
	a = (byte)((c & 0xFF000000) >> 24);
}

template<>
inline Color<float>::Color(unsigned int c)
{
	const float d = 1.0f / 255.0f;

	r = (float)((c & 0x00FF0000) >> 16) * d;
	g = (float)((c & 0x0000FF00) >> 8) * d;
	b = (float)((c & 0x000000FF) >> 0) * d;
	a = (float)((c & 0xFF000000) >> 24) * d;
}

template<>
inline Color<short>::Color(unsigned int c)
{
	// 4.12 fixed-point format
	r = (short)((c & 0x00FF0000) >> 12);
	g = (short)((c & 0x0000FF00) >> 4);
	b = (short)((c & 0x000000FF) << 4);
	a = (short)((c & 0xFF000000) >> 20);
}

template<>
inline Color<byte>::Color(unsigned int c)
{
	r = (byte)((c & 0x00FF0000) >> 16);
	g = (byte)((c & 0x0000FF00) >> 8);
	b = (byte)((c & 0x000000FF) >> 0);
	a = (byte)((c & 0xFF000000) >> 24);
}

template<>
inline Color<float>::Color(unsigned long c)
{
	const float d = 1.0f / 255.0f;

	r = (float)((c & 0x00FF0000) >> 16) * d;
	g = (float)((c & 0x0000FF00) >> 8) * d;
	b = (float)((c & 0x000000FF) >> 0) * d;
	a = (float)((c & 0xFF000000) >> 24) * d;
}

template<>
inline Color<short>::Color(unsigned long c)
{
	// 4.12 fixed-point format
	r = (short)((c & 0x00FF0000) >> 12);
	g = (short)((c & 0x0000FF00) >> 4);
	b = (short)((c & 0x000000FF) << 4);
	a = (short)((c & 0xFF000000) >> 20);
}

template<>
inline Color<byte>::Color(unsigned long c)
{
	r = (byte)((c & 0x00FF0000) >> 16);
	g = (byte)((c & 0x0000FF00) >> 8);
	b = (byte)((c & 0x000000FF) >> 0);
	a = (byte)((c & 0xFF000000) >> 24);
}

template<class T>
inline Color<T>::Color(T r_, T g_, T b_, T a_)
{
	r = r_;
	g = g_;
	b = b_;
	a = a_;
}

template<>
inline Color<float>::operator unsigned int() const
{
	return ((unsigned int)min(b * 255.0f, 255.0f) << 0) |
	       ((unsigned int)min(g * 255.0f, 255.0f) << 8) |
	       ((unsigned int)min(r * 255.0f, 255.0f) << 16) |
	       ((unsigned int)min(a * 255.0f, 255.0f) << 24);
}

template<>
inline Color<short>::operator unsigned int() const
{
	return ((unsigned int)min(b >> 4, 255) << 0) |
	       ((unsigned int)min(g >> 4, 255) << 8) |
	       ((unsigned int)min(r >> 4, 255) << 16) |
	       ((unsigned int)min(a >> 4, 255) << 24);
}

template<>
inline Color<byte>::operator unsigned int() const
{
	return (b << 0) +
	       (g << 8) +
	       (r << 16) +
	       (a << 24);
}

template<class T>
inline T &Color<T>::operator[](int i)
{
	return (&r)[i];
}

template<class T>
inline const T &Color<T>::operator[](int i) const
{
	return (&r)[i];
}

template<class T>
inline Color<T> Color<T>::operator+() const
{
	return *this;
}

template<class T>
inline Color<T> Color<T>::operator-() const
{
	return Color(-r, -g, -b, -a);
}

template<class T>
inline Color<T> &Color<T>::operator=(const Color &c)
{
	r = c.r;
	g = c.g;
	b = c.b;
	a = c.a;

	return *this;
}

template<class T>
inline Color<T> &Color<T>::operator+=(const Color &c)
{
	r += c.r;
	g += c.g;
	b += c.b;
	a += c.a;

	return *this;
}

template<class T>
inline Color<T> &Color<T>::operator*=(float l)
{
	*this = l * *this;

	return *this;
}

template<class T>
inline Color<T> operator+(const Color<T> &c1, const Color<T> &c2)
{
	return Color<T>(c1.r + c2.r,
	                c1.g + c2.g,
	                c1.b + c2.b,
	                c1.a + c2.a);
}

template<class T>
inline Color<T> operator-(const Color<T> &c1, const Color<T> &c2)
{
	return Color<T>(c1.r - c2.r,
	                c1.g - c2.g,
	                c1.b - c2.b,
	                c1.a - c2.a);
}

template<class T>
inline Color<T> operator*(float l, const Color<T> &c)
{
	T r = (T)(l * c.r);
	T g = (T)(l * c.g);
	T b = (T)(l * c.b);
	T a = (T)(l * c.a);

	return Color<T>(r, g, b, a);
}

template<class T>
inline Color<T> operator*(const Color<T> &c1, const Color<T> &c2)
{
	T r = c1.r * c2.r;
	T g = c1.g * c2.g;
	T b = c1.b * c2.b;
	T a = c1.a * c2.a;

	return Color<T>(r, g, b, a);
}

template<>
inline Color<short> operator*(const Color<short> &c1, const Color<short> &c2)
{
	short r = c1.r * c2.r >> 12;
	short g = c1.g * c2.g >> 12;
	short b = c1.b * c2.b >> 12;
	short a = c1.a * c2.a >> 12;

	return Color<short>(r, g, b, a);
}

template<>
inline Color<byte> operator*(const Color<byte> &c1, const Color<byte> &c2)
{
	byte r = c1.r * c2.r >> 8;
	byte g = c1.g * c2.g >> 8;
	byte b = c1.b * c2.b >> 8;
	byte a = c1.a * c2.a >> 8;

	return Color<byte>(r, g, b, a);
}

template<class T>
inline Color<T> operator/(const Color<T> &c, float l)
{
	l = 1.0f / l;

	T r = (T)(l * c.r);
	T g = (T)(l * c.g);
	T b = (T)(l * c.b);
	T a = (T)(l * c.a);

	return Color<T>(r, g, b, a);
}

template<class T>
inline Color<T> Color<T>::gradient(const Color<T> &c1, const Color<T> &c2, float d)
{
	d = 1.0f / d;

	T r = (c2.r - c1.r) * d;
	T g = (c2.g - c1.g) * d;
	T b = (c2.b - c1.b) * d;
	T a = (c2.a - c1.a) * d;

	return Color<T>(r, g, b, a);
}

template<class T>
inline Color<T> Color<T>::shade(const Color<T> &c1, const Color<T> &c2, float d)
{
	T r = c1.r + (T)(d * (c2.r - c1.r));
	T g = c1.g + (T)(d * (c2.g - c1.g));
	T b = c1.b + (T)(d * (c2.b - c1.b));
	T a = c1.a + (T)(d * (c2.a - c1.a));

	return Color<T>(r, g, b, a);
}

}  // namespace sw

#endif  // sw_Color_hpp
