#ifndef FONT_HPP
#define FONT_HPP

// Détection du système cible...
#include "usgeDetectSystem.h"

// C++
#include <string>
// Personnelles
#include "Image/Image.hpp"


namespace USpeedGameEngine
{

class Font
{
    /****************
    * Les attributs *
    ****************/
    public :
    protected :
    private :
        void *face;                             //!< La face de la police
        unsigned char *data;                    //!< Les données de la police
        bool loaded;                            //!< Pour savoir si on a des données de chargées
        int size;                               //!< La taille de la police (12 par défaut)
        unsigned long int color;                //!< La couleur du texte
        unsigned long int secondColor;          //!< La seconde couleur du texte (on fait un dégradé si elle est différente de "color")
        unsigned long int *computedRadian;      //!< Le tableau du dégradé de couleurs pré-calculé
        unsigned int radianSize;                //!< La taille du tableau du dégradé de couleurs pré-calculé
        bool utf8Encoded;                       //!< Pour savoir si on affiche de l'UNICODE ou de l'UTF-8
        int borderSize;                         //!< Épaisseur une bordure à chaque lettre
        unsigned long int borderColor;          //!< Couleur de la bordure
        bool borderOnly;                        //!< Permet de savoir si on trace uniquement la bordure

    /***************
    * Les méthodes *
    ***************/
    public :
        // Constructeur par défaut
        Font();
        // Destructeur par défaut
        ~Font();
        // Efface la police actuelle et charge le fichier de police spécifié
        bool load(const char *filename);
        bool load(std::string &datas, bool isContent);
        // Définit la taille de la police
        void setSize(int size);
        // Définit la(les) couleur(s) du texte
        void setColor(unsigned long int color);
        void setRadianColor(unsigned long int firstColor, unsigned long int secondColor);
        // Définit la bordure de la police.
        void setBorder(int theSize, unsigned long int theColor, bool drawBorderOnly);
        // Définit si on affiche du texte en UNICODE ou en UTF-8
        void setUtf8Encoded(bool isUTF8);
        // Pour savoir si une police est chargée
        bool isLoaded();
        // Retourne la taille actuelle de la police
        int getSize();
        // Efface la police actuelle
        void clear();
        // Effectue le rendu et affiche le texte spécifié avec la police "font"
        void print(const char *text, Image *img);
        void print(const char *text, Image *img, int *xCursor, int *yCursor);

        // Calcul la taille (largeur et hauteur) du texte demandé si on fait un rendu
        void computeSize(const char* text, unsigned int *width, unsigned int *height);
        // Convertit le texte spécifié de l'UTF-8 à l'unicode caractère par caractère
        unsigned int utf8ToUnicode(const char *text, unsigned int *newIdx);
    protected :
    private :
};

}       // Fin "namespace USpeedGameEngine"

#endif
