#include <graphlib.h>

void AffMsgChoix(const char *format, ...)		{
	char      vbuf[1024];
	va_list   arg_ptr;
	va_start(arg_ptr, format);
	_vsnprintf(vbuf, sizeof(vbuf), format, arg_ptr);
	CouleurTexte(TEXTE_NORMAL);
	Cadre(0,4*HAUT_CAR,LARG,HAUT,NOIR);
	MoveTo(0,4);
	printf(vbuf);
}

void Erreur(const char *format, ...)	{ 
	char      vbuf[1024];
	va_list   arg_ptr;
	va_start(arg_ptr, format);
	_vsnprintf(vbuf, sizeof(vbuf), format, arg_ptr);
	CouleurTexte(ROUGE);
	printf(vbuf);
	getch();
}


int ConvertitFonte(char *nom)			{
	FILE *f, *tbl;
	ECRAN *ecr, ecrCourant;
	OBJET *obj;
	int larg, haut, i, j, max_i, k, espacement;
	unsigned char r,v,b;
	char dest[1000], table[1000], str[100];
	unsigned short tmp[2];

	strcpy(dest,nom);
	strcpy(table,nom);
	strcat(nom,".bmp");
	strcat(dest,".fnt");
	strcat(table,".tbl");

	obj=ChargeObjet(nom);

	if (!obj)			{
		Erreur("Fichier %s non trouvé!",nom);
		return 0;
	}

	haut=obj->hauteur/224;									//Calcul de la hauteur de chaque caractère

	larg=obj->largeur&~3;									//Multiple de 4

	EcranCourant(&ecrCourant);
	ecr=CreeEcran(larg*4,obj->hauteur);
	ChoisitEcran(ecr);
	Objet(obj,0,0);

refait:
	tbl=fopen(table,"r");
	if (!tbl)			{
		ChoisitEcran(&ecrCourant);
		AffMsgChoix("Je ne peux pas connaître la taille des caractères! Il serait mieux que vous me fournissiez une table vous-même (%s), mais comme ce n'est pas le cas, je vais essayer de le deviner moi-même.\nEnter = Merci, Escape = Annuler\n",table);
		if (getch()==T_ESCAPE)
			return 0;
		AffMsgChoix("Pouvez-vous me dire quel espace dois-je laisser entre les caractères (je vous conseille 2 pour les petites polices, et 3 pour les plus grandes)? :>");
		scanf("%i",&espacement);
		ChoisitEcran(ecr);

		f=fopen(table,"w");
		for (k=0;k<224;k++)			{
			max_i=0;
			for (j=0;j<haut;j++)
				for (i=0;i<larg;i++)			{
					LitPixRVB(i,k*haut+j,&r,&v,&b);
					if (!r && !v && !b && i>max_i)
						max_i=i;
				}
			if (k==0)
				fprintf(f,"%c=%i\n",k+32,1+espacement);
			else
				fprintf(f,"%c=%i\n",k+32,max_i+espacement);
		}
		fclose(f);
		ChoisitEcran(&ecrCourant);
		AffMsgChoix("Vous pouvez à présent ouvir ce fichier à l'aide du bloc-notes et modifier les tailles qui ne sont pas correctes.\nEn attendant, la conversion sera effectuée avec ces paramètres.\n");
		getch();
		ChoisitEcran(ecr);
		goto refait;
	}

	f=fopen(dest,"wb");
	tmp[0]=larg/4;
	tmp[1]=haut;
	fwrite(tmp,2,sizeof(short),f);

	for (k=0;k<224;k++)			{
		fgets(str,sizeof(str),tbl);
		fputc(atoi(str+2),f);
	}
	fclose(tbl);

	for (j=0;j<obj->hauteur;j++)
		for (i=0;i<larg;i++)			{
			LitPixRVB(i,j,&r,&v,&b);
			if (r || v || b)
				fputc(0x00,f);
			else
				fputc(0x01,f);
		}

	for (j=0;j<obj->hauteur;j++)
		for (i=0;i<larg;i++)			{
			LitPixRVB(i,j,&r,&v,&b);
			if (r || v || b)
				fputc(0x00,f);
			else
				fputc(0xff,f);
		}

	fclose(f);
	ChoisitEcran(&ecrCourant);
	DetruitEcran(ecr);
	AffMsgChoix("Conversion terminée!");
	return 1;
}

#include "convertbmp.h"

/*int CreeFonte()			{
	FILE *f;
	ECRAN *ecr, ecrCourant;
	OBJET *obj;
	int larg, haut, i, j;
	unsigned char r,v,b;
	char nom[1000], nom2[1000];
	unsigned short tmp[2];

	AffMsgChoix("Veuillez prendre le temps d'entrer quelques paramètres.\n   Nom de la fonte :>\n   Largeur maximum des caractères (divisée par 4!) :>\n   Hauteur des caractères :>");
	MoveTo(21,5);
	scanf("%s",nom);
	MoveTo(53,6);
	scanf("%i",&larg);
	MoveTo(28,7);
	scanf("%i",&haut);*/

/*	obj=ChargeObjet(nom);

	if (!obj)			{
		Erreur("Fichier %s non trouvé!",nom);
		return 0;
	}

	haut=obj->hauteur/224;									//Calcul de la hauteur de chaque caractère

	larg=obj->largeur&~3;									//Multiple de 4

	EcranCourant(&ecrCourant);
	ecr=CreeEcran(larg*4,obj->hauteur);
	ChoisitEcran(ecr);
	Objet(obj,0,0);

	f=fopen(nom2,"wb");
	tmp[0]=larg/4;
	tmp[1]=haut;
	fwrite(tmp,2,sizeof(short),f);

	for (j=0;j<obj->hauteur;j++)
		for (i=0;i<larg;i++)			{
			LitPixRVB(i,j,&r,&v,&b);
			if (r || v || b)
				fputc(0x00,f);
			else
				fputc(0x01,f);
		}

	for (j=0;j<obj->hauteur;j++)
		for (i=0;i<larg*4;i++)			{
			LitPixRVB(4*i,j,&r,&v,&b);
			if (r || v || b)
				fputc(0x00,f);
			else
				fputc(0xff,f);
		}

	fclose(f);
	ChoisitEcran(&ecrCourant);
	DetruitEcran(ecr);
	AffMsgChoix("Conversion terminée!");
	return 1;
}*/

void main(void)			{
	int choix;
	char fichier[1000];

	CouleurTexte(JAUNE);
	AttributsTexte(GRAS);
	printf("Bienvenue!\n");
	AttributsTexte(NORMAL);
	CouleurTexte(TEXTE_NORMAL);
	SetWindowText(hConsole,"Convert.exe - © 2004 Florian Brönnimann - Powered by Graphlib (ma p'tite lib)");
	printf("Ceci convertira des fichiers des formats suivants en un format utilisable par la map interactive GBA.");

reprend_type:
	do		{
		AffMsgChoix("Quel type de fichier voulez-vous convertir?\n  1) Fonte\n  2) Bitmap\n\nVotre choix :>");
		scanf("%i",&choix);
	} while(choix<1 || choix>2);

	if (choix==1 || choix==2)			{
		AffMsgChoix("Nom de fichier :>");
		gets(fichier);
	}

	if (choix==1)			{
		if (!ConvertitFonte(fichier))
			goto reprend_type;
	}
	else if (choix==2)		{
		if (!ConvertitBmp(fichier))
			goto reprend_type;
	}

	getch();
}
