#include "AlphaFeld.h"
#include "Punkt.h"
#include "Bild.h"
#include "Scroll.h"
#include "ToolTip.h"
#include "Text.h"

using namespace Framework;

// Inhalt der AlphaFeld Klasse aus AlphaFeld.h
// Konstruktor 
AlphaFeld::AlphaFeld()
    : Zeichnung(),
    strength( 5 ),
    farbe( 0x9B000000 )
{}

AlphaFeld::~AlphaFeld()
{}

// nicht constant 
void AlphaFeld::setStrength( int st ) // setzt die St�rke
{
    strength = st;
    rend = 1;
}

void AlphaFeld::setFarbe( int f ) // setzt die Farbe
{
    farbe = f;
    rend = 1;
}

void AlphaFeld::render( Bild &zRObj ) // zeichnet nach zRObj
{
    Zeichnung::render( zRObj );
    int br = gr.x - 1;
    int hi = gr.y - 1;
    int xp = pos.x, yp = pos.y;
    int a = ( farbe >> 24 ) & 0xFF;
    int index = ( br / 2 ) * ( br <= hi ) + ( hi / 2 ) * ( br > hi );
    int fc = farbe & 0x00FFFFFF;
    int fc2 = farbe;
    if( strength > 0 )
        index = index > ( a / strength ) ? a / strength : index;
    if( strength < 0 )
        index = index > ( ( 255 - a ) / -strength ) ? ( ( 255 - a ) / -strength ) : index;
    for( int i = 0; i < index; ++i )
    {
        a -= strength;
        fc2 = ( a << 24 ) | fc;
        int i2 = i << 1;
        zRObj.drawLinieHAlpha( xp + i + 1, yp + i, br - i2, fc2 );		// oben links --- oben rechts
        zRObj.drawLinieVAlpha( xp + br - i, yp + i + 1, hi - i2, fc2 );	// oben rechts -- unten rechts
        zRObj.drawLinieHAlpha( xp + i, yp + hi - i, br - i2, fc2 );		// unten rechts - unten links
        zRObj.drawLinieVAlpha( xp + i, yp + i, hi - i2, fc2 );			// unten links -- oben links
    }
    if( index == br / 2 )
    {
        for( int i = index; i <= index + ( br - index ) - index; ++i )
            zRObj.drawLinieVAlpha( xp + i, yp + index, hi - ( index << 1 ) + 1, fc2 ); // rest Fl�che senkrecht
    }
    else
    {
        for( int i = index; i <= index + ( hi - index ) - index; ++i )
            zRObj.drawLinieHAlpha( xp + index, yp + i, br - ( index << 1 ) + 1, fc2 ); // rest Fl�che waagerecht
    }
}

// constant 
int AlphaFeld::getStrength() const // gibt die St�rke zur�ck
{
    return strength;
}

int AlphaFeld::getFarbe() const // gibt die Farbe zur�ck
{
    return farbe;
}

Zeichnung *AlphaFeld::dublizieren() const // Kopiert das Zeichnung
{
    AlphaFeld *obj = new AlphaFeld();
    obj->setPosition( pos );
    obj->setSize( gr );
    obj->setMausEreignisParameter( makParam );
    obj->setTastaturEreignisParameter( takParam );
    obj->setMausEreignis( mak );
    obj->setTastaturEreignis( tak );
    if( toolTip )
        obj->setToolTipZ( (ToolTip*)toolTip->dublizieren() );
    obj->setStrength( strength );
    obj->setFarbe( farbe );
    return obj;
}