#include "Farbe.h"
#include <math.h>

using namespace Framework;

// Inhalt der Klasse Farbe aus Farbe.h
// Konstruktor
Farbe::Farbe()
{
	fc = 0xFF000000;
	ref = 1;
}

Farbe::Farbe( unsigned char r, unsigned char g, unsigned char b )
{
	fc = 0xFF000000;
	setRGB( r, g, b ); // RGB setzen
	ref = 1;
}

Farbe::Farbe( unsigned char r, unsigned char g, unsigned char b, unsigned char a )
{
	fc = 0xFF000000;
	setRGBA( r, g, b, a ); // RGBA setzen
	ref = 1;
}

// nicht constant 
void Farbe::setR( unsigned char r ) // setzt r
{
	fc = ( fc & 0xFF00FFFF ) | ( r << 16 );
}

void Farbe::setG( unsigned char g ) // setzt g
{
	fc = ( fc & 0xFFFF00FF ) | ( g << 8 );
}

void Farbe::setB( unsigned char b ) // setzt b
{
	fc = ( fc & 0xFFFFFF00 ) | ( b );
}

void Farbe::setA( unsigned char a ) // setzt a
{
	fc = ( fc & 0x00FFFFFF ) | ( a << 24 );
}

void Farbe::setRGB( unsigned char r, unsigned char g, unsigned char b ) // setzt rgb
{
	fc = ( fc & 0xFF000000 ) | ( r << 16 ) | ( g << 8 ) | b;
}

void Farbe::setRGBA( unsigned char r, unsigned char g, unsigned char b, unsigned char a ) // setzt rgba
{
	fc = ( a << 24 ) | ( r << 16 ) | ( g << 8 ) | ( b );
}

void Farbe::setFarbe( unsigned int fc ) // setzt Farbcode 0xRGBA
{
	this->fc = fc;
}

// constant
unsigned char Farbe::getR() const // gibt R zurück
{
	return fc >> 16;
}

unsigned char Farbe::getG() const // gibt G zurück
{
	return fc >> 8;
}

unsigned char Farbe::getB() const // gibt B zurück
{
	return fc;
}

unsigned char Farbe::getA() const // gibt A zurück
{
	return fc >> 24;
}

unsigned int Farbe::getFarbe() const // gibt Farbcode zurück
{
	return fc;
}

bool Farbe::istGleich( unsigned char r, unsigned char g, unsigned char b, unsigned char a, int stärke ) const // vergleicht die Farben
{
	return ( abs( ( (int)( ( fc >> 16 ) & 0xFF ) - (int)r ) ) <= stärke ) &&
		   ( abs( ( (int)( ( fc >> 8 ) & 0xFF ) - (int)g ) ) <= stärke )  &&
		   ( abs( ( (int)( fc & 0xFF ) - (int)b ) ) <= stärke )           &&
		   ( abs( ( (int)( ( fc >> 24 ) & 0xFF ) - (int)a ) ) <= stärke );
}

// Reference Counting
Farbe *Farbe::getThis()
{
	ref++;
	return this;
}

Farbe *Farbe::release()
{
	ref--;
	if( ref == 0 )
		delete this;
	return 0;
}