#ifndef TEXTE_H
#define TEXTE_H
//Variables diverses pour le texte.
extern const u32 *fonte, *masque;
extern const char *tailles;
extern u32 hauteur_texte, largeur_texte;
extern u32 *adresse, largeur, hauteur;
extern u32 *adresse256;
extern u32 largeur256, hauteur256;

//Assez clair hm?
#define ChangeFonte(police)      (fonte=police##_fonte, masque=police##_masque, tailles=(const char*)police##_tailles, hauteur_texte=police##_hauteur)
#define ChangeFonte256(police)   (fonte=police##_fonte256, masque=police##_masque256, tailles=(const char*)police##_tailles, hauteur_texte=police##_hauteur, largeur_texte=police##_largeur)
#define LitFonteSt(police)       (police.fonte=fonte, police.masque=masque, police.tailles=tailles, police.hauteur=hauteur_texte, police.largeur=largeur_texte)
#define ChangeFonteSt(police)    (fonte=police.fonte, masque=police.masque, tailles=police.tailles, hauteur_texte=police.hauteur, largeur_texte=police.largeur)

//Demandes des handlers de menu. Ah, d'ailleurs la fonction de traçage de menu se trouve dans ce fichier.
enum demandes {DEM_ACTION=1, DEM_OPTION, DEM_GESTION};

//Fonctions d'accès au pixel en Mode0
void IN_IWRAM ClrPix(u32 x, u32 y);
void IN_IWRAM SetPix(u32 x, u32 y);
void IN_IWRAM EcritPixel(u32 x, u32 y, u32 couleur);
//Prépare une map pour pouvoir y écrire dessus au pixel près.
void IN_IWRAM PrepareMap(u16 *adresse, u32 x, u32 y, u32 offset, u32 largeur, u32 hauteur);
//Ecrit un motif (8 pixels) avec un masque (indiquant les zones à écrire ou non)
void IN_IWRAM EcritMotifMasque(u32 x, u32 y, u32 motif, u32 masque);
//Idem mais plusieurs motifs. Idéal pour le texte.
void IN_IWRAM EcritMotifsMasque(u32 x, u32 y, u32 nombre, const u32 *motifs, const u32 *masques);
//Idem mais effectue une multiplication du motif. Pour dessiner du texte coloré.
void IN_IWRAM EcritMotifsMasqueCouleur(u32 x, u32 y, u32 nombre, const u32 *motifs, const u32 *masques, u32 couleur);
//Dessine une chaîne
void IN_IWRAM DessTexte(u32 x, u32 y, char *chaine, u32 couleur);
//Dessine une chaîne sur plusieurs lignes en cas de besoin et avec un support de formatage basique.
void IN_IWRAM DessTexteWW(u32 x, u32 y, char *chaine, u32 couleur);
//Change la palette utilisée pour une partie d'une map
void ChangePaletteMap(u16 *adresse, u32 x, u32 y, u32 largeur, u32 hauteur, u32 nvPalette);
//Plus utilisé.
void DessTexteWWAvecScrolling(u32 x, u32 y, u32 scroll_y, char *chaine, u32 couleur);
//Dessin de caractères
void DessCar(u32 x, u32 y, u8 car, u32 couleur);
void DessCarItalique(u32 x, u32 y, u8 car, u32 couleur);
//Fonctions de base pour le Mode4 (que le lecteur utilise). Ca se ressemble, excepté que dans ce mode 8 bits, il faut écrire plus de motifs pour un caractère.
void IN_IWRAM EcritPixel256(u32 x, u32 y, u32 couleur);
void IN_IWRAM Ecrit4Pixels256(u32 x, u32 y, u32 *motif);
void IN_IWRAM EcritPlusDe4Pixels256(u32 x, u32 y, u32 nbre, u32 *motif);
void IN_IWRAM DessTexteSpecial(u32 x, u32 y, char *chaine, u32 couleur, u32 selection, u32 offset, unsigned char *(*handler)(), u8 bAffiche);
void IN_IWRAM DessTexte256(u32 x, u32 y, char *chaine, u32 couleur);

//Un lien (rempli par le dessinateur de menu)
typedef struct  {
    char symbole[32];
    int y, yfin, demande;
} LIEN;

//Les liens possibles
extern LIEN IN_EWRAM liens[30];
//Nombre d'événements (liens) trouvés dans le menu analysé.
extern u32 nEvenement;
//Message affiché au fond (pourquoi je l'ai appelé subliminal??)
extern char IN_EWRAM message_fond[100];

//Zone dans laquelle on pourra écrire (Mode 0)
//On découpe l'écran en plusieurs zones (carrés) où l'on serait éventuellement susceptible d'écrire
//quelque chose. Cela permet d'économiser de la mémoire vidéo plutôt que d'y bourrer un écran entier.
typedef struct      {
    void *adresse;
    int largeur, hauteur;
} ZONE_TEXTE;

//Sélectionne une zone pour pouvoir l'utiliser
extern void SelectZoneTexte(ZONE_TEXTE *z);
//Efface une zone de texte (la rend transparente avant de pouvoir dessiner dessus)
extern void EffaceZone(ZONE_TEXTE *z);

//Zone de débogage. Utilisée pour l'indicateur CPU et le petit message au fond.
extern ZONE_TEXTE zt_debug;
//Les buffers. La zone d'informations est utilisée pour afficher les boîtes d'informations.
extern u16 IN_EWRAM buffer_debug[30*8*16], buffer_infos[30*20*16];

//Débogage. En fait il faut alterner la fonction utilisée en fonction du mode graphique en cours!
//Effectue un printf en haut à gauche de l'écran et attend l'appui sur SELECT.
extern void Debug(const char *format, ...);

#endif


