/*
*	ImageTGA.cpp
*
*	Programmé par Hillaire Sébastien
*
*
*	Se référé au fichier en-tête .h pour plus de détail
*
*/

#include "ImageTGA.h"
#include "MemoryManager/DebugNew.h"

using namespace RenderSystem;

ImageTGA::ImageTGA()
{
	datas=NULL;
}

ImageTGA::~ImageTGA()
{
	delete [] datas;
}

bool ImageTGA::load(char *filepath)
{
	bool ret=false;
	FILE *f=NULL;

	f=fopen(filepath,"rb");

	if(f!=NULL)
	{
		char TGAheader[12]={0,0,2,0,0,0,0,0,0,0,0,0};// Header d'un TGA non compressé
		char TGAcompare[12];                         // Header TGA utilisé pour une comparaison
		char header[6];                              // 6 premiers bytes utiles du header
		unsigned int  imageSize;                     // taille de l'image
                                                    
		// Lit le fichier et son header
		if (fread(TGAcompare,1,sizeof(TGAcompare),f)!=sizeof(TGAcompare))// 12 bytes à lire ?
		{
			fclose(f); return false;
		}
		if (memcmp(TGAheader,TGAcompare,sizeof(TGAheader))!=0)// Correspondent-t-ils à ce qu'on a ?
		{
			fclose(f); return false;
		}
		if (fread(header,1,sizeof(header),f)!=sizeof(header))// Lisons les 6 bytes suivants
		{
			fclose(f); return false;
		}

		// Récupère les infos de l'image
		width  = (header[1] * 256 + header[0]);			// Détermine la largeur de l'image
		if(width<0)//on vérifie que le staille ne sont pas négative : bug bizarre déjà vu!!!
			width = -width;
		height = (header[3] * 256 + header[2]);			// Détermine la largeur de l'image
		if(height<0)//on vérifie que le staille ne sont pas négative : bug bizarre déjà vu!!!
			height = -height;
		bpp = header[4];								// Détermine le nombre de bits par pixel de l'image
		imageSize = width*height*bpp/8;                 // Calcule la taille de l'image

	
		// Charge l'image
		datas = new unsigned char[imageSize];
		if (fread(datas, 1, imageSize, f) != imageSize)
		{
			delete [] datas;
			fclose(f); return false;
		}
    
		// Inverse R et B
		int t;
		for ( unsigned int i = 0; i < imageSize; i += bpp / 8 )
		{
			t = datas[i];
			datas[i] = datas[i+2];
			datas[i+2] = t;
		}

		ret = true;
		fclose(f);
	}
	
	return ret;
}

unsigned int ImageTGA::getWidth()
{
	return (unsigned int)width;
}

unsigned int ImageTGA::getHeight()
{
	return (unsigned int)height;
}

unsigned short ImageTGA::getBPP()
{
	return (unsigned int)bpp;
}

unsigned char* ImageTGA::getDatasPointer()
{
	return &datas[0];
}


