//Macro sortant du cours de Ludovic ;)
#define Rvb15Bits(r,g,b)          ((r)+((g)<<5)+((b)<<10))

#define MULT (256/32)
#define ABS(x) ((x<0)?(-(x)):((x)))

//Variables de conversion. Je programme vraiment comme un boucher, c'est incroyable!
BOOL bGenereMap=TRUE, bOptimiseTileset=TRUE, bUtilTileset=-1;
int utilPalette=-1;

#include "reduction.h"

//Convertit une bitmap en 16 bits et crée le fichier.
//Le nom de fichier et tous les infos sont stockés dans els[0]
//Faudra que j'améliore ça.
//Retourne oui ou non si la conversion a été réalisée correctement
BOOL ConvertitBmp16(ELEMENT *els)		{
	int i,j,z;
	unsigned char r,v,b;
	FILE *ecri;
	ecri=fopen(els[0].nom_fichier,"wb");

	if (!ecri)			{
		CacheTravail();
		MessageBox(gblHDlg,"Impossible d'ouvrir le fichier en écriture.\nLe nom est probablement faux ou vous n'avez pas les autorisations d'accès dans ce répertoire (seriez-vous à l'école?).",els[0].nom_fichier,MB_ICONERROR);
		return 0;
	}

	ReinitSymTable();
	PrepareSymTable(2);
	VerifNomVar(els[0].nom_court,chneNomVarB16);
	InitSymbole(0,els[0].nom_base);								//%file%
	InitSymbole(4,tailleX*tailleY*2);							//%memory%
	InitSymbole(5,chneNomVarB16);								//%name%

	EcritChaineFiltree(b16_declaration,ecri);

	for (j=0;j<tailleY;j++)		{
		for (i=0;i<tailleX;i++)		{
			LitPixRVB(Bits2,i,j,&r,&v,&b);
			r=tblCoulR[r];
			v=tblCoulR[v];
			b=tblCoulR[b];
			if (*b16_fin_ligne)
				z=i;
			else
				z=i+j*tailleX;
			if (b16_nbChaqueX>0 && z>0 && z%b16_nbChaqueX==0)
				EcritChaineFiltree(b16_chaque_x,ecri);
			myprintf(ecri,b16_chaque_valeur,Rvb15Bits(r,v,b));
		}
		EcritChaineFiltree(b16_fin_ligne,ecri);
	}
	EcritChaineFiltree(b16_fin_declaration,ecri);

	fclose(ecri);
	return 1;
}




//Convertit et écrit une bitmap 8 bits avec la palette
//Nota bene: ici dans:
// -els[0] se trouve le fichier de base (mosaïque)
// -els[1] se trouve la palette

BOOL ConvertitBmp8(ELEMENT *els,int nCoul)		{
	int i,j,z, nbCouleurs, nEcrits=0, nCMax, prec, nCoulInitiales, nCoulBase;
	unsigned long *tableau;
	unsigned char *palette;

	FILE *ecri;
//	MessageBox(NULL,elements[nE].nom_palette,elements[nE].nom_base,0);

	tableau=(unsigned long*)malloc(tailleX*tailleY*sizeof(long));
	palette=(unsigned char*)malloc(257*3);

	tailleVoulueX=tailleVoulueY=0;

	if (utilPalette>=0)			{
		nCoulInitiales=LitPalette(palette,els[1].nom_fichier)-1;
		if (optimisePal)
			nCoulBase=0;
		else
			nCoulBase=nCoulInitiales;
	}
	else
		nCoulInitiales=nCoulBase=0;

	memmove(palette,palette+3,nCoulInitiales*3);
	for (i=0;i<nCoulInitiales*3;i++)
		palette[i]/=MULT;

	if (modeConversion==0)			{
		//Crée la palette
		nbCouleurs=CalcPaletteBmp8(tableau,palette,tailleY,tailleX,0,nCoulInitiales,nCoulBase,nCoul);
		prec=0;
		i=precisionMax;
		nCMax=-1;

		if (nbCouleurs==-1)		{
			if (messages)		{
				CacheTravail();
				if (MessageBox(gblHDlg,"La bitmap contient plus de couleurs que le nombre demandé.\nUn filtre va lui être appliqué (ne vous inquiétez pas ce sera bien mieux qu'avec Paint ;)\nCependant ceci peut durer long... très long!\n(mais de toutes façons les PCs sont assez rapides et puis c'est pas du VB!)\nIl est recommandé de continuer.","Coucou :D",MB_ICONINFORMATION | MB_OKCANCEL)==IDCANCEL)
					return 0;
				AffTravail();
			}
			while(1)		{
				nbCouleurs=CalcPaletteBmp8(tableau,palette,tailleY,tailleX,i,nCoulInitiales,nCoulBase,nCoul);
				if (nbCouleurs>nCMax)		{
					nCMax=nbCouleurs;
					prec=i;
				}
				if (nbCouleurs==-1)		{
					break;
				}
				if (i<=0)
					break;
				i--;
			}
			nbCouleurs=CalcPaletteBmp8(tableau,palette,tailleY,tailleX,prec,nCoulInitiales,nCoulBase,nCoul);
			if (nbCouleurs<1)		{
				CacheTravail();
				MessageBox(gblHDlg,"Impossible de convertir la bitmap car le nombre de couleurs requis ne peut être atteint","Oups...",MB_ICONERROR);
				return 0;
			}
		}
	}
	else if (modeConversion==1)		{
		nbCouleurs=ReductionHalftone(tableau,palette,tailleY,tailleX);
	}
	else if (modeConversion==2)		{
		nbCouleurs=ReductionOctree(tableau,palette,tailleY,tailleX,nCoulInitiales,nCoul-1);
		if (nbCouleurs<1)
			return 0;
	}

	//Support couleur transparente
	memmove(palette+3,palette,nbCouleurs*3);
	palette[0]=bleuZero;
	palette[1]=vertZero;
	palette[2]=rougeZero;
	nbCouleurs++;
	//Fin support

	//Ecrit la bitmap 8 bits
	ecri=fopen(els[0].nom_fichier,"wb");
	if (!ecri)		{
		CacheTravail();
		MessageBox(gblHDlg,"Impossible d'ouvrir le fichier en écriture.\nLe nom est probablement faux ou vous n'avez pas les autorisations d'accès dans ce répertoire (seriez-vous à l'école?).",els[0].nom_fichier,MB_ICONERROR);
		return 0;
	}

	ReinitSymTable();
	PrepareSymTable(2);
	VerifNomVar(els[0].nom_court,chneNomVarB8);
	InitSymbole(0,els[0].nom_base);								//%file%
	InitSymbole(4,tailleX*tailleY);								//%memory%
	InitSymbole(5,chneNomVarB8);								//%name%
	InitSymbole(6,els[1].nom_fichier);							//%link%

	EcritChaineFiltree(b8_declaration,ecri);
//	sprintf(str,"//%s\n//Converti avec GBA Graphics par Brünni\n//Bitmap 8 bits (\"%s\")\n//Taille: %i*%i\n//Mémoire: %i octets\n\nconst unsigned char %s_bitmap8[%i]=	{\n",els[0].nom_base,els[1].nom_fichier,tailleX,tailleY,tailleX*tailleY,els[1].nom_court,tailleY*tailleX);
//	fputs(str,ecri);

	for (j=0;j<tailleY;j++)		{
		for (i=0;i<tailleX;i++)		{
			if (*b8_fin_ligne)
				z=i;
			else
				z=i+j*tailleX;
			if (b8_nbChaqueX>0 && z>0 && z%b8_nbChaqueX==0)
				EcritChaineFiltree(b8_chaque_x,ecri);

			myprintf(ecri,b8_chaque_valeur,tableau[j*tailleX+i]);
		}
		EcritChaineFiltree(b8_fin_ligne,ecri);
	}
	EcritChaineFiltree(b8_fin_declaration,ecri);

	fclose(ecri);

	//Ecrit la palette
	ecri=fopen(els[1].nom_fichier,"wb");
	if (!ecri)		{
		CacheTravail();
		MessageBox(gblHDlg,"Impossible d'ouvrir le fichier en écriture.\nLe nom est probablement faux.",els[1].nom_fichier,MB_ICONERROR);
		return 0;
	}

	ReinitSymTable();
	PrepareSymTable(2);
	VerifNomVar(els[1].nom_court,chneNomVarPal);
	InitSymbole(0,els[1].nom_base);								//%file%
	InitSymbole(3,nbCouleurs);									//%size%
	InitSymbole(4,nbCouleurs*2);								//%memory%
	InitSymbole(5,chneNomVarPal);								//%name%

	EcritChaineFiltree(pal_declaration,ecri);
//	sprintf(str,"//%s\n//Converti avec GBA Graphics par Brünni\n//Palette\n//Taille: %i\n//Mémoire: %i octets\n\nconst unsigned short %s_palette[%i]=	{\n",els[0].nom_base,nbCouleurs,nbCouleurs*2,els[1].nom_court,nbCouleurs);
//	fputs(str,ecri);
//	nEcrits=0;

	for (i=0;i<nbCouleurs;i++)		{
		if (pal_nbChaqueX>0 && i>0 && i%pal_nbChaqueX==0)
			EcritChaineFiltree(pal_chaque_x,ecri);
		myprintf(ecri,pal_chaque_valeur,Rvb15Bits(palette[3*i+2],palette[3*i+1],palette[3*i]));
	}
	EcritChaineFiltree(pal_fin_declaration,ecri);

	fclose(ecri);

	free(tableau);
	free(palette);
	return 1;
}

//Convertit une bitmap et écrit une liste de mosaïques, une palette et une map
//Nota bene: ici dans:
// -els[0] se trouve le fichier de base (mosaïque)
// -els[1] se trouve la palette
// -els[2] se trouve la map

int ConvertitTiles(ELEMENT *els,int nCoul)		{
	int i,j,z, nE=nbreElements-2, nbCouleurs, nEcrits=0, nCMax, prec;
	int nCoulInitiales, nCoulBase, tileBase;
	unsigned long *tableau;
	unsigned char *palette;
	unsigned long *motifs;
	MAP *map;
	//Attention: c'est pour ça que tileX et tileY doivent être strictement inférieurs ou égaux à 64
	unsigned long motif_temp[64*64];
	FILE *ecri;
	int nTiles, x,y,k, xx, yy;

	if (tailleVoulueX==0)
		tailleVoulueX=tailleX;
	if (tailleVoulueY==0)
		tailleVoulueY=tailleY;

	//Mal à la tête. Pas envie de chercher un algo pour calculer.
	while (tailleVoulueX%tileX != 0)
		tailleVoulueX++;
	while (tailleVoulueY%tileY != 0)
		tailleVoulueY++;

	//Alloue la mémoire (une belle somme mine de rien)
	tableau=(unsigned long*)malloc(tailleVoulueX*tailleVoulueY*sizeof(long));
	palette=(unsigned char*)malloc(257*3);
	motifs=(unsigned long*)malloc(tileX*tileY*TILEMAX*sizeof(long));
	map=(MAP*)malloc((tailleVoulueX/tileX)*(tailleVoulueY/tileY)*sizeof(MAP));

	//Gestion des palettes, sauf si on est en mode 16 bits
	if (!bTil32Bits)			{
		if (utilPalette>=0)			{
			nCoulInitiales=LitPalette(palette,els[1].nom_fichier)-1;
			if (optimisePal /*&& !b16coul*/)
				nCoulBase=0;
			else		{
				nCoulBase=nCoulInitiales;
				//Cette partie désactive l'optimisation en cas de mode 16 couleurs!
				if (b16coul)		{
					nCoulInitiales+=16-((nCoulInitiales)%16);
					nCoul=nCoulInitiales+15;
				}
			}
		}
		else
			nCoulInitiales=nCoulBase=0;

		memmove(palette,palette+3,nCoulInitiales*3);
		for (i=0;i<nCoulInitiales*3;i++)
			palette[i]/=MULT;

		if (modeConversion==0)			{
			//Crée la palette
			nbCouleurs=CalcPalette(tableau,palette,tailleY,tailleX,0,nCoulInitiales,nCoulBase,nCoul);
			prec=0;
			i=precisionMax;
			nCMax=-1;

			if (nbCouleurs==-1)		{
				if (messages)		{
					CacheTravail();
					if (MessageBox(gblHDlg,"La bitmap contient plus de couleurs que le nombre demandé.\nUn filtre va lui être appliqué (ne vous inquiétez pas ce sera bien mieux qu'avec Paint ;)\nCependant ceci peut durer long... très long!","Coucou :D",MB_ICONINFORMATION|MB_OKCANCEL)==IDCANCEL)
						return 0;
					AffTravail();
				}

				while(1)		{
					nbCouleurs=CalcPalette(tableau,palette,tailleY,tailleX,i,nCoulInitiales,nCoulBase,nCoul);
					if (nbCouleurs>nCMax)		{
						nCMax=nbCouleurs;
						prec=i;
					}
					if (nbCouleurs==-1)		{
						break;
					}
					if (i<=0)
						break;
					i--;
				}
				nbCouleurs=CalcPalette(tableau,palette,tailleY,tailleX,prec,nCoulInitiales,nCoulBase,nCoul);
				if (nbCouleurs<1)		{
					CacheTravail();
					MessageBox(gblHDlg,"Impossible de convertir la bitmap car le nombre de couleurs requis ne peut être atteint","Oups...",MB_ICONERROR);
					return 0;
				}
			}
		}
		else if (modeConversion==1)		{
			nbCouleurs=ReductionHalftone(tableau,palette,tailleY,tailleX);
		}
		else if (modeConversion==2)		{
			nbCouleurs=ReductionOctree(tableau,palette,tailleY,tailleX,nCoulInitiales,nCoul-1);
			if (nbCouleurs<1)
				return 0;
		}
	}
	else	{
		CreeTableauConversion(tableau,palette, tailleY, tailleX);
	}

	tailleX=tailleVoulueX;
	tailleY=tailleVoulueY;

	i=tileX;
	j=tileY;
	//Crée le tileset
	if (bUtilTileset>=0)			{
		nTiles=LitTileset(NULL,&motifs,els[0].nom_fichier,1);
	}
	else
		nTiles=0;
	tileX=i;
	tileY=j;
	nTiles/=((i/8)*(j/8));

	if (!bTil32Bits)			{
//		if (utilPalette<0)		{
			memmove(palette+3,palette,nbCouleurs*3);
			palette[0]=bleuZero;
			palette[1]=vertZero;
			palette[2]=rougeZero;
			nbCouleurs++;
//		}
	}

	if (optimiseTil)
		tileBase=0;
	else
		tileBase=nTiles;

	for (j=0;j<tailleY;j+=tileY)		{
		for (i=0;i<tailleX;i+=tileX)		{

			for (yy=0;yy<tileY;yy+=8)		{
				for (xx=0;xx<tileX;xx+=8)		{
					for (y=0;y<8;y++)
						for (x=0;x<8;x++)		{
								motif_temp[y*8+x+yy*tileX+xx*8]=tableau[(j+y+yy)*tailleX+(x+i+xx)];
						}
				}
			}

			//Optimisation du tileset?
			if (bOptimiseTileset)		{
				//Recherche d'une mosaïque identique
				for (k=tileBase;k<nTiles;k++)		{
					if (!memcmp(motifs+tileX*tileY*k,motif_temp,tileX*tileY*sizeof(long)))
						break;
				}
			}
			else
				k=nTiles;

			//Pas trouvé
			if (k==nTiles)		{
				//Et là s'il est vraiment trop élevé
				if ((tileX/8)*(tileY/8)*nTiles>=TILEMAX-1)		{
					CacheTravail();
					MessageBox(gblHDlg,"Impossible de convertir car le nombre de mosaïques est beaucoup trop élevé...","Convertisseur de mosaïques",MB_ICONERROR);
					return 0;
				}
				memcpy(motifs+tileX*tileY*nTiles,motif_temp,tileX*tileY*sizeof(long));
				if (ModeTexte)
					map[(j/tileY)*(tailleX/tileX)+i/tileX]=nTiles;
				else
					map[(j/tileY)*(tailleX/tileX)+i/tileX]=nTiles&0xff;
				nTiles++;
			}
			else		{
				if (ModeTexte)
					map[(j/tileY)*(tailleX/tileX)+i/tileX]=k;
				else
					map[(j/tileY)*(tailleX/tileX)+i/tileX]=k&0xff;
			}
		}
	}

	//Si la mémoire GBA est pleine... Je lance cet avertissement à la fin pour éviter que
	//l'utilisateur reçoive ce message et directement à la suite le deuxième indiquant
	//qu'il a dépassé la mémoire du convertisseur lorsque c'est le cas.
	if (nTiles*(tileX/8)*(tileY/8)>(ModeTexte?1024:256))		{
		if (messages)		{
			CacheTravail();
			if (MessageBox(gblHDlg,"La bitmap contient plus de mosaïques qu'il n'est disponible sur GBA (1024 mosaïques pour le mode texte et 256 pour le mode rotation).\nLe résultat risque de ne ressembler à rien. Vous êtes prévenu!","Convertisseur de mosaïques",MB_ICONEXCLAMATION|MB_OKCANCEL)==IDCANCEL)
				return 0;
			AffTravail();
		}
	}

	//Ecrit la map
	if (bGenereMap)			{
		ecri=fopen(els[2].nom_fichier,"wb");
		if (!ecri)		{
			CacheTravail();
			MessageBox(gblHDlg,"Impossible d'ouvrir le fichier en écriture.\nLe nom est probablement faux.",els[2].nom_fichier,MB_ICONERROR);
			return 0;
		}

		tailleX/=tileX;
		tailleY/=tileY;

		ReinitSymTable();
		PrepareSymTable(2);
		VerifNomVar(els[2].nom_court,chneNomVarMap);
		InitSymbole(0,els[2].nom_base);								//%file%
		i=tailleX*tailleY;
		if (ModeTexte==2)
			InitSymbole(4,tailleX*tailleY*4);						//%memory%
		else if (ModeTexte==1)
			InitSymbole(4,tailleX*tailleY*2);						//%memory%
		else
			InitSymbole(4,tailleX*tailleY);							//%memory%
		InitSymbole(5,chneNomVarMap);								//%name%
		InitSymbole(6,els[0].nom_fichier);							//%link%
		if (ModeTexte==0)
			InitSymbole(9,8);										//%depth%
		else if (ModeTexte==1)
			InitSymbole(9,16);										//%depth%
		else if (ModeTexte==2)
			InitSymbole(9,32);										//%depth%
		if (ModeTexte==2)
			InitSymbole(10,type32);									//%type%
		else if (ModeTexte)
			InitSymbole(10,type16);									//%type%
		else
			InitSymbole(10,type8);									//%type%

		EcritChaineFiltree(map_declaration,ecri);

	//	sprintf(str,"//%s\n//Converti avec GBA Graphics par Brünni\n//Map (%s,%s)\n//Taille: %i*%i*%i*%i\n//Mémoire: %i octets\n\nconst unsigned char %s_tiles[%i]=	{\n",elements[nE].nom_base,elements[nE].nom_map,tileX,tileY,tailleX,tailleY,(tailleX/tileX)*(tailleY/tileY)*2,elements[nbreElements].nom_court,(tailleX/tileX)*(tailleY/tileY));
/*		sprintf(str,"//%s\n"
			"//Converti avec GBA Graphics par Brünni\n"
			"//Map (\"%s\",\"%s\")\n"
			"//Taille: %i*%i * %i*%i\n"
			"//Mémoire: %i octets\n\n"
			"const unsigned %s %s_map[%i][%i]=	{\n	{"
			,els[0].nom_base,
			els[1].nom_fichier,els[0].nom_fichier,
			tileX,tileY,tailleX/tileX,tailleY/tileY,
			(tailleX/tileX)*(tailleY/tileY)*(ModeTexte?2:1),
			ModeTexte?"short":"char",
			els[2].nom_court,(tailleY/tileY),(tailleX/tileX));*/

//		fputs(str,ecri);

		nEcrits=0;
		for (j=0;j<tailleY;j++)		{
			for (i=0;i<tailleX;i++)		{
				if (*map_fin_ligne)
					z=i;
				else
					z=(j*tailleX)+i;

				if (map_nbChaqueX>0 && z>0 && z%map_nbChaqueX==0)
					EcritChaineFiltree(map_chaque_x,ecri);

				if (ModeTexte==2)
					myprintf(ecri,map_chaque_valeur_3,map[tailleX*j+i]);
				else if (ModeTexte==1)
					myprintf(ecri,map_chaque_valeur_1,map[tailleX*j+i]);
				else
					myprintf(ecri,map_chaque_valeur_2,map[tailleX*j+i]);

				nEcrits++;
			}
			EcritChaineFiltree(map_fin_ligne,ecri);
		}
		EcritChaineFiltree(map_fin_declaration,ecri);

		fclose(ecri);
	}
	//EndIf bGenereMap

	//Ecrit le tileset
	ecri=fopen(els[0].nom_fichier,"wb");
	if (!ecri)		{
		CacheTravail();
		MessageBox(gblHDlg,"Impossible d'ouvrir le fichier en écriture.\nLe nom est probablement faux ou vous n'avez pas les autorisations d'accès dans ce répertoire (seriez-vous à l'école?).",els[0].nom_fichier,MB_ICONERROR);
		return 0;
	}

	i=nTiles*tileX*tileY;
	if (b16coul)		i/=2;

	ReinitSymTable();
	PrepareSymTable(2);
	VerifNomVar(els[0].nom_court,chneNomVarTil);
	InitSymbole(0,els[0].nom_base);								//%file%
	InitSymbole(3,nTiles*((tileX*tileY)/(8*8)));				//%size%
	InitSymbole(4,i);											//%memory%
	InitSymbole(5,chneNomVarTil);								//%name%
	if (!bTil32Bits)
		InitSymbole(6,els[1].nom_fichier);						//%link%
	else
		InitSymbole(6,"");										//%link%
	if (bTil32Bits==1)
		InitSymbole(9,16);										//%depth%
	else if (b16coul)
		InitSymbole(9,4);										//%depth%
	else
		InitSymbole(9,8);										//%depth%
	if (bTil32Bits==1)			{
		InitSymbole(12,tileset16);								//%bits%
	}
	else if (b16coul)
		InitSymbole(12,tileset4);								//%bits%
	else
		InitSymbole(12,tileset8);								//%bits%
//	InitSymbole(12,b16coul?tileset4:tileset8);					//%bits%
	if (bTil32Bits==1)
		InitSymbole(10,type16);									//%type%
	else
		InitSymbole(10,type8);									//%type%

	EcritChaineFiltree(til_declaration,ecri);

//	sprintf(str,"//%s\n//Converti avec GBA Graphics par Brünni\n//Tileset%s(\"%s\")\n//Taille: %i*%i*%i\n//Mémoire: %i octets\n\nconst unsigned char %s_tiles[%i]=	{\n",els[0].nom_base,b16coul?" 4 bits ":" ",els[1].nom_fichier,8,8,nTiles*(tileX/8)*(tileY/8),i,els[0].nom_court,i);
//	fputs(str,ecri);

	nEcrits=0;
	//Toujours du 8x8
	tileX=tileY=8;
	nTiles*=(tileX/8)*(tileY/8);

	for (i=0;i<nTiles;i++)		{
		for (j=0;j<tileX*tileY;j++)		{
			if (*til_fin_ligne)
				z=j;
			else
				z=nEcrits;

			if (til_nbChaqueX>0 && z>0 && z%til_nbChaqueX==0)
				EcritChaineFiltree(til_chaque_x,ecri);

			if (bTil32Bits==1)
				myprintf(ecri,til_chaque_valeur_3,motifs[(i*tileX*tileY)+j]);
			else if (b16coul)
				myprintf(ecri,til_chaque_valeur_2,((motifs[(i*tileX*tileY)+j+1]&0x0f)<<4)|(motifs[(i*tileX*tileY)+j]&0x0f));
			else
				myprintf(ecri,til_chaque_valeur_1,motifs[(i*tileX*tileY)+j]);

			if (b16coul)
				j++;

			nEcrits++;
		}
		EcritChaineFiltree(til_fin_ligne,ecri);
	}
	EcritChaineFiltree(til_fin_declaration,ecri);

	fclose(ecri);

	if (!bTil32Bits)			{
		//Ecrit la palette
		ecri=fopen(els[1].nom_fichier,"wb");
		if (!ecri)		{
			CacheTravail();
			MessageBox(gblHDlg,"Impossible d'ouvrir le fichier en écriture.\nLe nom est probablement faux.",els[1].nom_fichier,MB_ICONERROR);
			return 0;
		}

		ReinitSymTable();
		PrepareSymTable(2);
		VerifNomVar(els[1].nom_court,chneNomVarPal);
		InitSymbole(0,els[1].nom_base);								//%file%
		InitSymbole(3,nbCouleurs);									//%size%
		InitSymbole(4,nbCouleurs*2);								//%memory%
		InitSymbole(5,chneNomVarPal);								//%name%

		EcritChaineFiltree(pal_declaration,ecri);
	//	sprintf(str,"//%s\n//Converti avec GBA Graphics par Brünni\n//Palette\n//Taille: %i\n//Mémoire: %i octets\n\nconst unsigned short %s_palette[%i]=	{\n",els[0].nom_base,nbCouleurs,nbCouleurs*2,els[1].nom_court,nbCouleurs);
	//	fputs(str,ecri);
	//	nEcrits=0;

		for (i=0;i<nbCouleurs;i++)		{
			if (pal_nbChaqueX>0 && i>0 && i%pal_nbChaqueX==0)
				EcritChaineFiltree(pal_chaque_x,ecri);
			myprintf(ecri,pal_chaque_valeur,Rvb15Bits(palette[3*i+2],palette[3*i+1],palette[3*i]));
		}
		EcritChaineFiltree(pal_fin_declaration,ecri);
	}

	fclose(ecri);

	free(tableau);
	free(palette);
	free(motifs);
	free(map);
	return 1;
}

void CreeMap(const char *nom)		{
	FILE *f;
	if (!(f=fopen(nom,"r")))			{
		MessageBox(gblHDlg,"Le fichier n'existe pas encore",nom,MB_ICONINFORMATION);
//		fopen(nom,"w");
//		fclose(f);
	}
}
