#include "Rahmen.h"
#include "Punkt.h"
#include "Farbe.h"
#include "Bild.h"

using namespace Framework;

// Inhalt der LRahmen Klasse aus Rahmen.h
// Konstruktor 
LRahmen::LRahmen()
:	Objekt()
{
	br = 1;
	farbe = new Farbe( 0, 0, 0 );
	Alpha = 0;
	ref = 1;
}

// Destruktor 
LRahmen::~LRahmen()
{
	farbe->release();
}

// nicht constant 
void LRahmen::setRamenBreite( int br ) // setzt die Breite des Rahmens
{
	lockObjekt();
	this->br = br;
	unlockObjekt();
}

void LRahmen::setAlpha( bool a ) // Legt fest, ob der Alphawert der Farbe berücksichtigt werden soll
{
	lockObjekt();
	Alpha = a;
	unlockObjekt();
}

void LRahmen::setFarbe( Farbe *f ) // Legt die Farbe des Rahmens fest
{
	lockObjekt();
	if( !farbe )
		farbe = new Farbe();
	farbe->setFarbe( f->getFarbe() );
	f->release();
	unlockObjekt();
}

void LRahmen::setFarbe( int fc )
{
	lockObjekt();
	if( !farbe )
		farbe = new Farbe();
	farbe->setFarbe( fc );
	unlockObjekt();
}

void LRahmen::setFarbeZ( Farbe *f ) // setzt einen Zeiger zur Farbe
{
	lockObjekt();
	if( farbe )
		farbe->release();
	farbe = f;
	unlockObjekt();
}

void LRahmen::render( Bild *Obj ) // Zeichnet den Rahmen in das Renderobjekt
{
	lockObjekt();
	int x = pos->x;
	int y = pos->y;
	int b = x + gr->x - 1;
	int h = y + gr->y - 1;
	int fc = farbe->getFarbe();
	if( Alpha )
	{
		for( int i = 0; i < br; i++ )
		{
			Obj->drawLinieHAlpha( x + i + 1, y + i, gr->x - i * 2 - 1, fc );
			Obj->drawLinieVAlpha( b - i, y + i + 1, gr->y - i * 2 - 2, fc );
			Obj->drawLinieHAlpha( x + i + 1, h - i, gr->x - i * 2 - 1, fc );
			Obj->drawLinieVAlpha( x + i, y + i, gr->y - i * 2, fc );
		}
	}
	else
	{
		for( int i = 0; i < br; i++ )
		{
			Obj->drawLinieH( x + i + 1, y + i, gr->x - i * 2 - 1, fc );
			Obj->drawLinieV( b - i, y + i + 1, gr->y - i * 2 - 2, fc );
			Obj->drawLinieH( x + i + 1, h - i, gr->x - i * 2 - 1, fc );
			Obj->drawLinieV( x + i, y + i, gr->y - i * 2, fc );
		}
	}
	unlockObjekt();
}

void LRahmen::render( int xOff, int yOff, int bOff, int hOff, Bild *Obj )
{
	lockObjekt();
	Obj->setDrawOptions( xOff, yOff, xOff + bOff, yOff + hOff );
	int x = xOff + pos->x;
	int y = yOff + pos->y;
	int b = x + gr->x - 1;
	int h = y + gr->y - 1;
	int fc = farbe->getFarbe();
	if( Alpha )
	{
		for( int i = 0; i < br; i++ )
		{
			Obj->drawLinieHAlpha( x + i + 1, y + i, gr->x - i * 2 - 1, fc );
			Obj->drawLinieVAlpha( b - i, y + i + 1, gr->y - i * 2 - 2, fc );
			Obj->drawLinieHAlpha( x + i + 1, h - i, gr->x - i * 2 - 1, fc );
			Obj->drawLinieVAlpha( x + i, y + i, gr->y - i * 2, fc );
		}
	}
	else
	{
		for( int i = 0; i < br; i++ )
		{
			Obj->drawLinieH( x + i + 1, y + i, gr->x - i * 2 - 1, fc );
			Obj->drawLinieV( b - i, y + i + 1, gr->y - i * 2 - 2, fc );
			Obj->drawLinieH( x + i + 1, h - i, gr->x - i * 2 - 1, fc );
			Obj->drawLinieV( x + i, y + i, gr->y - i * 2, fc );
		}
	}
	Obj->setDrawOptions( -1, -1, -1, -1 );
	unlockObjekt();
}

// constant 
int LRahmen::getRBreite() const // Gibt die Breite des Rahmens zurück
{
	return br;
}

Farbe *LRahmen::getFarbe() const // Gibt die Farbe des Ramens zurück
{
	return farbe->getThis();
}

int LRahmen::getFarbeCode() const // Gibt die Farbe des Ramens zurück
{
	return farbe->getFarbe();
}

Farbe *LRahmen::zFarbe() const
{
	return farbe;
}

bool LRahmen::hatAlpha() const // Gibt zurück, ob der Alphawert der Farbe beachtet wird
{
	return Alpha;
}

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

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