#include "CameraImageWrapper.h"
#include <QColor>
#include <QApplication>
#include <QDesktopWidget>

CameraImageWrapper::CameraImageWrapper() : LuminanceSource()
{
}

CameraImageWrapper::CameraImageWrapper(CameraImageWrapper& otherInstance) : LuminanceSource()
{
    image = otherInstance.getOriginalImage().copy();
}

CameraImageWrapper::~CameraImageWrapper()
{
}

int CameraImageWrapper::getWidth() const
{
    return image.width();
}

int CameraImageWrapper::getHeight() const
{
    return image.height();
}

unsigned char CameraImageWrapper::getPixel(int x, int y) const
{
    QRgb pixel = image.pixel(x,y);

    return qGray(pixel);//((qRed(pixel) + qGreen(pixel) + qBlue(pixel)) / 3);
}

unsigned char* CameraImageWrapper::copyMatrix() const
{
    unsigned char* newMatrix = (unsigned char*)malloc(image.width()*image.height()*sizeof(unsigned char));

    int cnt = 0;
    for(int i=0; i<image.width(); i++)
    {
        for(int j=0; j<image.height(); j++)
        {
            newMatrix[cnt++] = getPixel(i,j);
        }
    }

    return newMatrix;
}

void CameraImageWrapper::setImage(QString fileName)
{
    image.load(fileName);

    if(image.width() > QApplication::desktop()->width())
        image = image.scaled(QApplication::desktop()->width(), image.height(), Qt::IgnoreAspectRatio);

    if(image.height() > QApplication::desktop()->height())
        image = image.scaled(image.width(), QApplication::desktop()->height(), Qt::IgnoreAspectRatio);
}

void CameraImageWrapper::setImage(QImage newImage)
{
    image = newImage.copy();

    if(image.width() > 640)
        image = image.scaled(640, image.height(), Qt::KeepAspectRatio);
}

QImage CameraImageWrapper::grayScaleImage(QImage::Format f)
{
    QImage tmp(image.width(), image.height(), f);
    for(int i=0; i<image.width(); i++)
    {
        for(int j=0; j<image.height(); j++)
        {
            int pix = (int)getPixel(i,j);
            tmp.setPixel(i,j, qRgb(pix ,pix,pix));
        }   
    }

    return tmp;

    //return image.convertToFormat(f);
}

QImage CameraImageWrapper::getOriginalImage()
{
    return image;
}


unsigned char* CameraImageWrapper::getRow(int y, unsigned char* row)
{
    int width = getWidth();

    if (row == NULL)
    {
        row = new unsigned char[width];
        pRow = row;
    }

    for (int x = 0; x < width; x++)
        row[x] = getPixel(x,y);

    return row;
}

unsigned char* CameraImageWrapper::getMatrix()
{
    int width = getWidth();
    int height =  getHeight();
    unsigned char* matrix = new unsigned char[width*height];
    unsigned char* m = matrix;

    for(int y=0; y<height; y++)
    {
        unsigned char* tmpRow;
        memcpy(m, tmpRow = getRow(y, NULL), width);
        m += width * sizeof(unsigned char);

        delete tmpRow;
    }

    pMatrix = matrix;
    return matrix;
}