/*====================ÉCOLE POLYTECHNIQUE DE MONTRÉAL============================

	NOM DU FICHIER :CFont.cpp

	DESCRIPTION :	Implémentation des fonctions de la classe CFont

	AUTEUR : Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse

===============================================================================*/
#include <stdio.h>
#include <cassert>
#include <vector>
using std::vector;
#include "CFont.h"
#include <GL/glut.h>

/*------------------------------------------------------------------
  Fonction :	Init()

  Description :	Initialisation

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
void CFont::Init()
{
	this->ptrFont = gltext::OpenFont(FontFile.c_str(), Height);
		if (this->ptrFont <= 0)
		{
		    return;
		}
	this->ptrRenderer = gltext::CreateRenderer(gltext::TEXTURE, this->ptrFont);
		if (this->ptrRenderer <= 0)
		{
		    return;
		}
}

/*------------------------------------------------------------------
  Fonction :	CFont()

  Description :	Constructeur d'une police

  Paramètres :
	-char* FontFile : Nom du fichier de la police
	-unsigned int Height : Hauteur de la police
	
	***Si les paramètres ne sont pas spécifiés, il faut faire appel à la fonction InitialSetup()***

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
CFont::CFont(char* FontFile, unsigned int Height)
{
	this->ptrFont = 0;
	this->ptrRenderer = 0;
	this->FontFile = FontFile;
	this->Height = Height;
}

/*------------------------------------------------------------------
  Fonction :	InitialSetup()

  Description :	Initialisation des paramètres de la police si celle-ci n'a pas été faite
                                          à l'aide du constructeur.

  Paramètres :
	-char* FontFile : Nom du fichier de la police
	-unsigned int Height : Hauteur de la police
	
	***Cette fonction n'a aucun effet si la police est initialisée à l'aide des
                             paramètres passés au constructeur ***

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
void CFont::InitialSetup(char* FontFile, unsigned int Height)
{
    if (ptrFont != 0) return;
	this->FontFile = FontFile;
	this->Height = Height;    
}

/*------------------------------------------------------------------
  Fonction :	glDrawTextML()

  Description :	Dessine un message en mode multi lignes

  Paramètres :
	-float x : Position en x
	-float y : Position en y
	-string strString : Message

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
void CFont::glDrawTextML(float x, float y, string strString)
{
	if (this->ptrFont == 0) Init();
	int CurLine = 0;

	if (strString == "")								// Check if a string was given
		return;											// Don't render anything then
	
#define DISP 5

	string TmpStr = "";
	for (int i = 0; i <= strString.size(); i++)
	{
		if (strString[i] != '\n' && strString[i] != '\0')
		{
			TmpStr += strString[i];
		} else {
			glPushMatrix();
			{
				glTranslatef(x,y+CurLine*this->GetHeight()+ ((CurLine > 0) ? DISP : 0)-this->GetHeight(),0);
				this->ptrRenderer->render(TmpStr.c_str());
			}
			glPopMatrix();
			CurLine++;
			TmpStr = "";
		}
	}
}

/*
	Be Carefull : glDrawText & glDrawTextML uses (x,y) position as the bottom left position of the text!
*/

/*------------------------------------------------------------------
  Fonction :	glDrawTextML()

  Description :	Dessine un message uniligne

  Paramètres :
	-float x : Position en x
	-float y : Position en y
	-const char* cString : Message

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
void CFont::glDrawText(float x, float y, const char* cString)
{
	if (this->ptrFont == 0) Init();
	if (cString == 0 || cString[0] == 0)								// Check if a string was given
		return;											// Don't render anything then

	glPushMatrix();
	{
		glTranslatef(x,y-this->GetHeight(),0);
		this->ptrRenderer->render(cString);
	}
	glPopMatrix();
	glRasterPos2f(x,y);
}

/*------------------------------------------------------------------
  Fonction :	GetTextWidth()

  Description :	Retourne la largeur d'une chaîne dans la police courante

  Paramètres :
	-const char* strString : Message

  Retour :
                     -int : Largeur du message
	
  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
int CFont::GetTextWidth(const char *strString)
{
	if (this->ptrFont == 0) Init();

	if (strString == NULL)								// Check if a string was given
		return 0;											// Don't render anything then

	return this->ptrRenderer->getWidth(strString);
}

/*------------------------------------------------------------------
  Fonction :	CharWidth()

  Description :	Retourne la largeur d'un caractère

  Paramètres :
	-const char Char : Le caractère
	
  Retour :
                     -int : Largeur du caractère
		     
  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
int CFont::CharWidth(const char Char)
{
	if (this->ptrFont == 0) Init();
	string TmpString(1,Char);
	return this->ptrRenderer->getWidth(TmpString.c_str());
}

/*------------------------------------------------------------------
  Fonction :	GetHeight()

  Description :	Retourne la hauteur de la police

  Retour :
                     -unsigned int : hauteur de la police

  Par : 2004-3-16 Martin Bisson, Anne-Marie Buki, Mylene Denis & Jean-Francois Pérusse
  MAJ: 
------------------------------------------------------------------*/
unsigned int CFont::GetHeight()
{
	return this->Height;
}
