#include "mask.h"
#include <QDebug>
#include <QPixmap>
#include <QBitmap>

Mask::Mask( QString p )
    : path( p ),
      mask( 0 )
{}

Mask::~Mask()
{
    unloadMask();
}

// Lädt das Masken Bild
void Mask::loadMask()
{
    if( !mask )
    {
        mask = new QImage( path );
    }
}

// Gibt das Maskenbild zurück
QImage *Mask::getMask()
{
    return mask;
}

// Gibt ein Bild zurück, indem der Weiße Teil transparent ist
QPixmap Mask::getDrawableImage()
{
    QPixmap mp( path );
    mp.setMask( mp.createMaskFromColor( QColor( 0, 0, 0 ), Qt::MaskOutColor ) );
    return mp;
}

// Prüft, ob ein Polygon im verbotenen Bereich liegt
bool Mask::isPolygonInside( QPolygon p )
{
    loadMask();
    int pCount = p.count();
    for( int i = 0; i< pCount; i++ )
    {
        if( mask->pixel( p.at( i ).x(), p.at( i ).y() ) != 0xFF000000 )
            return true;
    }
    return false;
}

// Erstellt eine neue Maske
void Mask::createMask( QSize s )
{
    if( mask )
        delete mask;
    mask = new QImage( s, QImage::Format_RGB32 );
    mask->fill( Qt::white );
}

// Speichert die Maske
void Mask::save() const
{
    mask->save( path );
}

// Erzeugt für ein Bild das JPEGImage bild
//  img: Das Bild zu dem das JPEGImage generiert werden soll
//  frameName: Der Name des Bildes
void Mask::saveToFrameMask( cv::Mat img, QString frameName ) const
{
    cv::Mat result;
    cv::Mat mask = cv::imread( path.toStdString() );
    cv::bitwise_and( img, mask, result );
    qDebug() << path.mid( 0, path.lastIndexOf( "/", path.lastIndexOf( "/" ) - 1 ) + 1 ) + "JPEGImages/" + frameName;
    cv::imwrite( (path.mid( 0, path.lastIndexOf( "/", path.lastIndexOf( "/" ) - 1 ) + 1 ) + "JPEGImages/" + frameName).toStdString(), result );
}

// Löscht die Maske aus dem Speicher
void Mask::unloadMask()
{
    delete mask;
    mask = 0;
}