// 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/Types.hpp"
#include "System/Math.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;
};
}

#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
