#include "olcPGE_Pixel.h"

namespace olc {
    Pixel::Pixel()
	{
		r = 0; g = 0; b = 0; a = 255;
	}

	Pixel::Pixel(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha)
	{
		r = red; g = green; b = blue; a = alpha;
	}

	Pixel::Pixel(uint32_t p)
	{
		n = p;
	}

	Pixel Pixel::CreateFromHSV(uint8_t h, uint8_t s, uint8_t v, uint8_t alpha) {
		Pixel rgb;
		rgb.a = alpha;
		uint8_t region, remainder, p, q, t;

		if (s == 0)
		{
			rgb.r = v;
			rgb.g = v;
			rgb.b = v;
			return rgb;
		}

		region = h / 43;
		remainder = (h - (region * 43)) * 6; 

		p = (v * (255 - s)) >> 8;
		q = (v * (255 - ((s * remainder) >> 8))) >> 8;
		t = (v * (255 - ((s * (255 - remainder)) >> 8))) >> 8;

		switch (region)
		{
			case 0:
				rgb.r = v; rgb.g = t; rgb.b = p;
				break;
			case 1:
				rgb.r = q; rgb.g = v; rgb.b = p;
				break;
			case 2:
				rgb.r = p; rgb.g = v; rgb.b = t;
				break;
			case 3:
				rgb.r = p; rgb.g = q; rgb.b = v;
				break;
			case 4:
				rgb.r = t; rgb.g = p; rgb.b = v;
				break;
			default:
				rgb.r = v; rgb.g = p; rgb.b = q;
				break;
		}

		return rgb;
	}
}