#include "Img.h"


Img::Img() {
    // Values to indicate not a valid image yet. 
    w = -1;
    h = -1;
    Bpp = 0;
    data = 0;
}
Img::~Img() 
{
    if(data != 0);
        delete[] data;
}

void Img::init(unsigned char *data1, int w1, int h1, int Bpp1) 
{
    assert( data1 != 0 );
    assert( w1 > 0 );
    assert( h1 > 0 );
    assert( Bpp1 > 0 );

    w = w1; h = h1; Bpp = Bpp1;
    data = new unsigned char[w*h*Bpp];

    for(int i = 0; i < w*h*Bpp; ++i)
        data[i] = data1[i];
}

void Img::init(int w1, int h1, int Bpp1) 
{
    assert( w1 > 0 );
    assert( h1 > 0 );
    assert( Bpp1 > 0 );

    w = w1; h = h1; Bpp = Bpp1;
    data = new unsigned char[w*h*Bpp];

    for(int i = 0; i < w*h*Bpp; ++i)
        data[i] = 0;
}

void Img::init(Img *img)
{
    assert( img->get_w() > 0 );
    assert( img->get_h() > 0 );
    assert( img->Bpp > 0 );

    w = img->w; h = img->h; Bpp = img->Bpp;
    data = new unsigned char[w*h*Bpp];

    for(int i = 0; i < w*h*Bpp; ++i)
        data[i] = img->data[i];
}

unsigned char Img::get_data(int i, int j, int d) {
    assert( i >= 0 && i < w);
    assert( j >= 0 && j < h);
    assert( d >= 0 && d < Bpp);

    return data[ind(i,j)+d];
}

void Img::set_data(int i, int j, int d, unsigned char dat) {
    assert( i >= 0 && i < w);
    assert( j >= 0 && j < h);
    assert( d >= 0 && d < Bpp);

    data[ind(i,j)+d] = dat;
}


bool Img::is_data() {
    return (data != 0);
}

int Img::get_w() {
    return w;
}
    
int Img::get_h() {
    return h;
}

int Img::get_Bpp() {
    return Bpp;
}

int Img::ind(int i, int j) {
    return w*j*Bpp + i*Bpp;
}


void Img::print_ppm()
{
    cout<<"P3"<<endl;
    cout<<w<<" "<<h<<endl;
    cout<<"255"<<endl;

    assert(Bpp == 1 || Bpp == 3);

    if(Bpp == 1)
    {
        for(int i = 0; i < w*h; i+=3)
            cout<<(int)data[i]<<" "<<(int)data[i]<<" "<<(int)data[i]<<endl;
    }
    else if(Bpp == 3)
    {
        for(int i = 0; i < 3*w*h; i+=3)
            cout<<(int)data[i]<<" "<<(int)data[i+1]<<" "<<(int)data[i+2]<<endl;
    }
}

