Fixed a FREEZE from r619 in Load screen, which happened when previewing an image, if your palette showed more than 255 colors...
Reworked GIF Save/Load. Now saves as GI89a, and is able to save and reload text comments. git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@624 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
parent
17dbcfa61e
commit
aaa393e12f
360
loadsave.c
360
loadsave.c
@ -115,7 +115,7 @@ void Save_PNG(void);
|
|||||||
T_Format FormatFichier[NB_FORMATS_CONNUS] = {
|
T_Format FormatFichier[NB_FORMATS_CONNUS] = {
|
||||||
{"pkm", Test_PKM, Load_PKM, Save_PKM, 1, 1},
|
{"pkm", Test_PKM, Load_PKM, Save_PKM, 1, 1},
|
||||||
{"lbm", Test_LBM, Load_LBM, Save_LBM, 1, 0},
|
{"lbm", Test_LBM, Load_LBM, Save_LBM, 1, 0},
|
||||||
{"gif", Test_GIF, Load_GIF, Save_GIF, 1, 0},
|
{"gif", Test_GIF, Load_GIF, Save_GIF, 1, 1},
|
||||||
{"bmp", Test_BMP, Load_BMP, Save_BMP, 1, 0},
|
{"bmp", Test_BMP, Load_BMP, Save_BMP, 1, 0},
|
||||||
{"pcx", Test_PCX, Load_PCX, Save_PCX, 1, 0},
|
{"pcx", Test_PCX, Load_PCX, Save_PCX, 1, 0},
|
||||||
{"img", Test_IMG, Load_IMG, Save_IMG, 1, 0},
|
{"img", Test_IMG, Load_IMG, Save_IMG, 1, 0},
|
||||||
@ -2845,7 +2845,7 @@ void Load_GIF(void)
|
|||||||
word Valeur_Eof; // Valeur <=> Fin d'image
|
word Valeur_Eof; // Valeur <=> Fin d'image
|
||||||
long Taille_du_fichier;
|
long Taille_du_fichier;
|
||||||
struct stat Informations_Fichier;
|
struct stat Informations_Fichier;
|
||||||
|
int Nombre_LID; // Nombre d'images trouvées dans le fichier
|
||||||
|
|
||||||
/////////////////////////////////////////////////// FIN DES DECLARATIONS //
|
/////////////////////////////////////////////////// FIN DES DECLARATIONS //
|
||||||
|
|
||||||
@ -2855,7 +2855,8 @@ void Load_GIF(void)
|
|||||||
GIF_Last_byte=0;
|
GIF_Last_byte=0;
|
||||||
GIF_Rest_bits=0;
|
GIF_Rest_bits=0;
|
||||||
GIF_Rest_byte=0;
|
GIF_Rest_byte=0;
|
||||||
|
Nombre_LID=0;
|
||||||
|
|
||||||
Nom_fichier_complet(Nom_du_fichier,0);
|
Nom_fichier_complet(Nom_du_fichier,0);
|
||||||
|
|
||||||
if ((GIF_Fichier=fopen(Nom_du_fichier, "rb")))
|
if ((GIF_Fichier=fopen(Nom_du_fichier, "rb")))
|
||||||
@ -2927,166 +2928,191 @@ void Load_GIF(void)
|
|||||||
Set_palette(Principal_Palette);
|
Set_palette(Principal_Palette);
|
||||||
}
|
}
|
||||||
|
|
||||||
// On s'apprête à sauter tous les blocks d'extension:
|
|
||||||
|
|
||||||
// On lit un indicateur de block
|
// On lit un indicateur de block
|
||||||
read_byte(GIF_Fichier,&Block_indicateur);
|
read_byte(GIF_Fichier,&Block_indicateur);
|
||||||
// Si l'indicateur de block annonce un block d'extension:
|
while (Block_indicateur!=0x3B && !Erreur_fichier)
|
||||||
while (Block_indicateur==0x21)
|
|
||||||
{
|
{
|
||||||
// Lecture du code de fonction:
|
switch (Block_indicateur)
|
||||||
read_byte(GIF_Fichier,&Block_indicateur);
|
|
||||||
|
|
||||||
// On exploitera peut-être un jour ce code indicateur pour stocker
|
|
||||||
// des remarques dans le fichier. En attendant d'en connaître plus
|
|
||||||
// on se contente de sauter tous les blocs d'extension:
|
|
||||||
|
|
||||||
// Lecture de la taille du bloc:
|
|
||||||
read_byte(GIF_Fichier,&Taille_de_lecture);
|
|
||||||
while (Taille_de_lecture!=0)
|
|
||||||
{
|
{
|
||||||
// On saute le bloc:
|
case 0x21: // Bloc d'extension
|
||||||
fseek(GIF_Fichier,Taille_de_lecture,SEEK_CUR);
|
{
|
||||||
// Lecture de la taille du bloc suivant:
|
byte Code_Fonction;
|
||||||
read_byte(GIF_Fichier,&Taille_de_lecture);
|
// Lecture du code de fonction:
|
||||||
|
read_byte(GIF_Fichier,&Code_Fonction);
|
||||||
|
// Lecture de la taille du bloc:
|
||||||
|
read_byte(GIF_Fichier,&Taille_de_lecture);
|
||||||
|
while (Taille_de_lecture!=0 && !Erreur_fichier)
|
||||||
|
{
|
||||||
|
switch(Code_Fonction)
|
||||||
|
{
|
||||||
|
case 0xFE: // Comment Block Extension
|
||||||
|
// On récupère le premier commentaire non-vide,
|
||||||
|
// on jette les autres.
|
||||||
|
if (Principal_Commentaire[0]=='\0')
|
||||||
|
{
|
||||||
|
int Caracteres_a_garder=Min(Taille_de_lecture,TAILLE_COMMENTAIRE);
|
||||||
|
|
||||||
|
read_bytes(GIF_Fichier,Principal_Commentaire,Caracteres_a_garder);
|
||||||
|
Principal_Commentaire[Caracteres_a_garder+1]='\0';
|
||||||
|
// Si le commentaire etait trop long, on fait avance-rapide
|
||||||
|
// sur la suite.
|
||||||
|
if (Taille_de_lecture>Caracteres_a_garder)
|
||||||
|
fseek(GIF_Fichier,Taille_de_lecture-Caracteres_a_garder,SEEK_CUR);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0xF9: // Graphics Control Extension
|
||||||
|
// Prévu pour la transparence
|
||||||
|
|
||||||
|
default:
|
||||||
|
// On saute le bloc:
|
||||||
|
fseek(GIF_Fichier,Taille_de_lecture,SEEK_CUR);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// Lecture de la taille du bloc suivant:
|
||||||
|
read_byte(GIF_Fichier,&Taille_de_lecture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0x2C: // Local Image Descriptor
|
||||||
|
{
|
||||||
|
// Si on a deja lu une image, c'est une GIF animée ou bizarroide, on sort.
|
||||||
|
if (Nombre_LID!=0)
|
||||||
|
{
|
||||||
|
Erreur_fichier=2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Nombre_LID++;
|
||||||
|
|
||||||
|
// lecture de 10 derniers octets
|
||||||
|
if ( read_word_le(GIF_Fichier,&(IDB.Pos_X))
|
||||||
|
&& read_word_le(GIF_Fichier,&(IDB.Pos_Y))
|
||||||
|
&& read_word_le(GIF_Fichier,&(IDB.Largeur_image))
|
||||||
|
&& read_word_le(GIF_Fichier,&(IDB.Hauteur_image))
|
||||||
|
&& read_byte(GIF_Fichier,&(IDB.Indicateur))
|
||||||
|
&& read_byte(GIF_Fichier,&(IDB.Nb_bits_pixel))
|
||||||
|
&& IDB.Largeur_image && IDB.Hauteur_image)
|
||||||
|
{
|
||||||
|
Principal_Largeur_image=IDB.Largeur_image;
|
||||||
|
Principal_Hauteur_image=IDB.Hauteur_image;
|
||||||
|
|
||||||
|
Initialiser_preview(IDB.Largeur_image,IDB.Hauteur_image,Taille_du_fichier,FORMAT_GIF);
|
||||||
|
|
||||||
|
// Palette locale dispo = (IDB.Indicateur and $80)
|
||||||
|
// Image entrelacée = (IDB.Indicateur and $40)
|
||||||
|
// Ordre de classement = (IDB.Indicateur and $20)
|
||||||
|
// Nombre de bits/pixel = (IDB.Indicateur and $07)+1 (si palette locale dispo)
|
||||||
|
|
||||||
|
if (IDB.Indicateur & 0x80)
|
||||||
|
{
|
||||||
|
// Palette locale dispo
|
||||||
|
|
||||||
|
Nb_couleurs=(1 << ((IDB.Indicateur & 0x07)+1));
|
||||||
|
Nb_bits_initial=(IDB.Indicateur & 0x07)+2;
|
||||||
|
|
||||||
|
if (!(IDB.Indicateur & 0x40))
|
||||||
|
// Palette dans l'ordre:
|
||||||
|
for(Indice_de_couleur=0;Indice_de_couleur<Nb_couleurs;Indice_de_couleur++)
|
||||||
|
{
|
||||||
|
read_byte(GIF_Fichier,&Principal_Palette[Indice_de_couleur].R);
|
||||||
|
read_byte(GIF_Fichier,&Principal_Palette[Indice_de_couleur].V);
|
||||||
|
read_byte(GIF_Fichier,&Principal_Palette[Indice_de_couleur].B);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Palette triée par composantes:
|
||||||
|
for (Indice_de_couleur=0;Indice_de_couleur<Nb_couleurs;Indice_de_couleur++)
|
||||||
|
read_byte(GIF_Fichier,&Principal_Palette[Indice_de_couleur].R);
|
||||||
|
for (Indice_de_couleur=0;Indice_de_couleur<Nb_couleurs;Indice_de_couleur++)
|
||||||
|
read_byte(GIF_Fichier,&Principal_Palette[Indice_de_couleur].V);
|
||||||
|
for (Indice_de_couleur=0;Indice_de_couleur<Nb_couleurs;Indice_de_couleur++)
|
||||||
|
read_byte(GIF_Fichier,&Principal_Palette[Indice_de_couleur].B);
|
||||||
|
}
|
||||||
|
Set_palette(Principal_Palette);
|
||||||
|
}
|
||||||
|
|
||||||
|
Remapper_fileselect();
|
||||||
|
|
||||||
|
Valeur_Clr =Nb_couleurs+0;
|
||||||
|
Valeur_Eof =Nb_couleurs+1;
|
||||||
|
Alphabet_Free=Nb_couleurs+2;
|
||||||
|
GIF_Nb_bits =Nb_bits_initial;
|
||||||
|
Alphabet_Max =((1 << GIF_Nb_bits)-1);
|
||||||
|
GIF_Entrelacee =(IDB.Indicateur & 0x40);
|
||||||
|
GIF_Passe =0;
|
||||||
|
|
||||||
|
/*Init_lecture();*/
|
||||||
|
|
||||||
|
Erreur_fichier=0;
|
||||||
|
GIF_Image_entrelacee_terminee=0;
|
||||||
|
|
||||||
|
//////////////////////////////////////////// DECOMPRESSION LZW //
|
||||||
|
|
||||||
|
while ( (GIF_Get_next_code()!=Valeur_Eof) && (!Erreur_fichier) )
|
||||||
|
{
|
||||||
|
if (GIF_Code_actuel<=Alphabet_Free)
|
||||||
|
{
|
||||||
|
if (GIF_Code_actuel!=Valeur_Clr)
|
||||||
|
{
|
||||||
|
if (Alphabet_Free==(Read_byte=GIF_Code_actuel))
|
||||||
|
{
|
||||||
|
GIF_Code_actuel=Code_ancien;
|
||||||
|
Alphabet_Pile[Alphabet_Pos_pile++]=Cas_special;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (GIF_Code_actuel>Valeur_Clr)
|
||||||
|
{
|
||||||
|
Alphabet_Pile[Alphabet_Pos_pile++]=Alphabet_Suffixe[GIF_Code_actuel];
|
||||||
|
GIF_Code_actuel=Alphabet_Prefixe[GIF_Code_actuel];
|
||||||
|
}
|
||||||
|
|
||||||
|
Cas_special=Alphabet_Pile[Alphabet_Pos_pile++]=GIF_Code_actuel;
|
||||||
|
|
||||||
|
do
|
||||||
|
GIF_Nouveau_pixel(Alphabet_Pile[--Alphabet_Pos_pile]);
|
||||||
|
while (Alphabet_Pos_pile!=0);
|
||||||
|
|
||||||
|
Alphabet_Prefixe[Alphabet_Free ]=Code_ancien;
|
||||||
|
Alphabet_Suffixe[Alphabet_Free++]=GIF_Code_actuel;
|
||||||
|
Code_ancien=Read_byte;
|
||||||
|
|
||||||
|
if (Alphabet_Free>Alphabet_Max)
|
||||||
|
{
|
||||||
|
if (GIF_Nb_bits<12)
|
||||||
|
Alphabet_Max =((1 << (++GIF_Nb_bits))-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // Code Clear rencontré
|
||||||
|
{
|
||||||
|
GIF_Nb_bits =Nb_bits_initial;
|
||||||
|
Alphabet_Max =((1 << GIF_Nb_bits)-1);
|
||||||
|
Alphabet_Free =Nb_couleurs+2;
|
||||||
|
Cas_special =GIF_Get_next_code();
|
||||||
|
Code_ancien =GIF_Code_actuel;
|
||||||
|
GIF_Nouveau_pixel(GIF_Code_actuel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Erreur_fichier=2;
|
||||||
|
} // Code End-Of-Information ou erreur de fichier rencontré
|
||||||
|
|
||||||
|
/*Close_lecture();*/
|
||||||
|
|
||||||
|
if (Erreur_fichier>=0)
|
||||||
|
if ( /* (GIF_Pos_X!=0) || */
|
||||||
|
( ( (!GIF_Entrelacee) && (GIF_Pos_Y!=Principal_Hauteur_image) ) ||
|
||||||
|
( (GIF_Entrelacee) && (!GIF_Image_entrelacee_terminee) )
|
||||||
|
) )
|
||||||
|
Erreur_fichier=2;
|
||||||
|
} // Le fichier contenait un IDB
|
||||||
|
else
|
||||||
|
Erreur_fichier=2;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lecture du code de fonction suivant:
|
// Lecture du code de fonction suivant:
|
||||||
read_byte(GIF_Fichier,&Block_indicateur);
|
read_byte(GIF_Fichier,&Block_indicateur);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Block_indicateur==0x2C)
|
|
||||||
{
|
|
||||||
// Présence d'un Image Separator Header
|
|
||||||
|
|
||||||
// lecture de 10 derniers octets
|
|
||||||
if ( read_word_le(GIF_Fichier,&(IDB.Pos_X))
|
|
||||||
&& read_word_le(GIF_Fichier,&(IDB.Pos_Y))
|
|
||||||
&& read_word_le(GIF_Fichier,&(IDB.Largeur_image))
|
|
||||||
&& read_word_le(GIF_Fichier,&(IDB.Hauteur_image))
|
|
||||||
&& read_byte(GIF_Fichier,&(IDB.Indicateur))
|
|
||||||
&& read_byte(GIF_Fichier,&(IDB.Nb_bits_pixel))
|
|
||||||
&& IDB.Largeur_image && IDB.Hauteur_image)
|
|
||||||
{
|
|
||||||
Principal_Largeur_image=IDB.Largeur_image;
|
|
||||||
Principal_Hauteur_image=IDB.Hauteur_image;
|
|
||||||
|
|
||||||
Initialiser_preview(IDB.Largeur_image,IDB.Hauteur_image,Taille_du_fichier,FORMAT_GIF);
|
|
||||||
|
|
||||||
// Palette locale dispo = (IDB.Indicateur and $80)
|
|
||||||
// Image entrelacée = (IDB.Indicateur and $40)
|
|
||||||
// Ordre de classement = (IDB.Indicateur and $20)
|
|
||||||
// Nombre de bits/pixel = (IDB.Indicateur and $07)+1 (si palette locale dispo)
|
|
||||||
|
|
||||||
if (IDB.Indicateur & 0x80)
|
|
||||||
{
|
|
||||||
// Palette locale dispo
|
|
||||||
|
|
||||||
Nb_couleurs=(1 << ((IDB.Indicateur & 0x07)+1));
|
|
||||||
Nb_bits_initial=(IDB.Indicateur & 0x07)+2;
|
|
||||||
|
|
||||||
if (!(IDB.Indicateur & 0x40))
|
|
||||||
// Palette dans l'ordre:
|
|
||||||
for(Indice_de_couleur=0;Indice_de_couleur<Nb_couleurs;Indice_de_couleur++)
|
|
||||||
{
|
|
||||||
read_byte(GIF_Fichier,&Principal_Palette[Indice_de_couleur].R);
|
|
||||||
read_byte(GIF_Fichier,&Principal_Palette[Indice_de_couleur].V);
|
|
||||||
read_byte(GIF_Fichier,&Principal_Palette[Indice_de_couleur].B);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Palette triée par composantes:
|
|
||||||
for (Indice_de_couleur=0;Indice_de_couleur<Nb_couleurs;Indice_de_couleur++)
|
|
||||||
read_byte(GIF_Fichier,&Principal_Palette[Indice_de_couleur].R);
|
|
||||||
for (Indice_de_couleur=0;Indice_de_couleur<Nb_couleurs;Indice_de_couleur++)
|
|
||||||
read_byte(GIF_Fichier,&Principal_Palette[Indice_de_couleur].V);
|
|
||||||
for (Indice_de_couleur=0;Indice_de_couleur<Nb_couleurs;Indice_de_couleur++)
|
|
||||||
read_byte(GIF_Fichier,&Principal_Palette[Indice_de_couleur].B);
|
|
||||||
}
|
|
||||||
Set_palette(Principal_Palette);
|
|
||||||
}
|
|
||||||
|
|
||||||
Remapper_fileselect();
|
|
||||||
|
|
||||||
Valeur_Clr =Nb_couleurs+0;
|
|
||||||
Valeur_Eof =Nb_couleurs+1;
|
|
||||||
Alphabet_Free=Nb_couleurs+2;
|
|
||||||
GIF_Nb_bits =Nb_bits_initial;
|
|
||||||
Alphabet_Max =((1 << GIF_Nb_bits)-1);
|
|
||||||
GIF_Entrelacee =(IDB.Indicateur & 0x40);
|
|
||||||
GIF_Passe =0;
|
|
||||||
|
|
||||||
/*Init_lecture();*/
|
|
||||||
|
|
||||||
Erreur_fichier=0;
|
|
||||||
GIF_Image_entrelacee_terminee=0;
|
|
||||||
|
|
||||||
//////////////////////////////////////////// DECOMPRESSION LZW //
|
|
||||||
|
|
||||||
while ( (GIF_Get_next_code()!=Valeur_Eof) && (!Erreur_fichier) )
|
|
||||||
{
|
|
||||||
if (GIF_Code_actuel<=Alphabet_Free)
|
|
||||||
{
|
|
||||||
if (GIF_Code_actuel!=Valeur_Clr)
|
|
||||||
{
|
|
||||||
if (Alphabet_Free==(Read_byte=GIF_Code_actuel))
|
|
||||||
{
|
|
||||||
GIF_Code_actuel=Code_ancien;
|
|
||||||
Alphabet_Pile[Alphabet_Pos_pile++]=Cas_special;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (GIF_Code_actuel>Valeur_Clr)
|
|
||||||
{
|
|
||||||
Alphabet_Pile[Alphabet_Pos_pile++]=Alphabet_Suffixe[GIF_Code_actuel];
|
|
||||||
GIF_Code_actuel=Alphabet_Prefixe[GIF_Code_actuel];
|
|
||||||
}
|
|
||||||
|
|
||||||
Cas_special=Alphabet_Pile[Alphabet_Pos_pile++]=GIF_Code_actuel;
|
|
||||||
|
|
||||||
do
|
|
||||||
GIF_Nouveau_pixel(Alphabet_Pile[--Alphabet_Pos_pile]);
|
|
||||||
while (Alphabet_Pos_pile!=0);
|
|
||||||
|
|
||||||
Alphabet_Prefixe[Alphabet_Free ]=Code_ancien;
|
|
||||||
Alphabet_Suffixe[Alphabet_Free++]=GIF_Code_actuel;
|
|
||||||
Code_ancien=Read_byte;
|
|
||||||
|
|
||||||
if (Alphabet_Free>Alphabet_Max)
|
|
||||||
{
|
|
||||||
if (GIF_Nb_bits<12)
|
|
||||||
Alphabet_Max =((1 << (++GIF_Nb_bits))-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else // Code Clear rencontré
|
|
||||||
{
|
|
||||||
GIF_Nb_bits =Nb_bits_initial;
|
|
||||||
Alphabet_Max =((1 << GIF_Nb_bits)-1);
|
|
||||||
Alphabet_Free =Nb_couleurs+2;
|
|
||||||
Cas_special =GIF_Get_next_code();
|
|
||||||
Code_ancien =GIF_Code_actuel;
|
|
||||||
GIF_Nouveau_pixel(GIF_Code_actuel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Erreur_fichier=2;
|
|
||||||
} // Code End-Of-Information ou erreur de fichier rencontré
|
|
||||||
|
|
||||||
/*Close_lecture();*/
|
|
||||||
|
|
||||||
if (Erreur_fichier>=0)
|
|
||||||
if ( /* (GIF_Pos_X!=0) || */
|
|
||||||
( ( (!GIF_Entrelacee) && (GIF_Pos_Y!=Principal_Hauteur_image) ) ||
|
|
||||||
( (GIF_Entrelacee) && (!GIF_Image_entrelacee_terminee) )
|
|
||||||
) )
|
|
||||||
Erreur_fichier=2;
|
|
||||||
} // Le fichier contenait un IDB
|
|
||||||
else
|
|
||||||
Erreur_fichier=2;
|
|
||||||
|
|
||||||
} // Le fichier contenait une image
|
|
||||||
else
|
|
||||||
Erreur_fichier=2;
|
|
||||||
|
|
||||||
} // Le fichier contenait un LSDB
|
} // Le fichier contenait un LSDB
|
||||||
else
|
else
|
||||||
Erreur_fichier=1;
|
Erreur_fichier=1;
|
||||||
@ -3221,7 +3247,7 @@ void Save_GIF(void)
|
|||||||
if ((GIF_Fichier=fopen(Nom_du_fichier,"wb")))
|
if ((GIF_Fichier=fopen(Nom_du_fichier,"wb")))
|
||||||
{
|
{
|
||||||
// On écrit la signature du fichier
|
// On écrit la signature du fichier
|
||||||
if (write_bytes(GIF_Fichier,"GIF87a",6))
|
if (write_bytes(GIF_Fichier,"GIF89a",6))
|
||||||
{
|
{
|
||||||
// La signature du fichier a été correctement écrite.
|
// La signature du fichier a été correctement écrite.
|
||||||
|
|
||||||
@ -3265,6 +3291,19 @@ void Save_GIF(void)
|
|||||||
// Le jour où on se servira des blocks d'extensions pour placer
|
// Le jour où on se servira des blocks d'extensions pour placer
|
||||||
// des commentaires, on le fera ici.
|
// des commentaires, on le fera ici.
|
||||||
|
|
||||||
|
// Ecriture de la transparence
|
||||||
|
//write_bytes(GIF_Fichier,"\x21\xF9\x04\x01\x00\x00\xNN\x00",8);
|
||||||
|
|
||||||
|
// Ecriture du commentaire
|
||||||
|
if (Principal_Commentaire[0])
|
||||||
|
{
|
||||||
|
write_bytes(GIF_Fichier,"\x21\xFE",2);
|
||||||
|
write_byte(GIF_Fichier,strlen(Principal_Commentaire));
|
||||||
|
write_bytes(GIF_Fichier,Principal_Commentaire,strlen(Principal_Commentaire)+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// On va écrire un block indicateur d'IDB et l'IDB du fichier
|
// On va écrire un block indicateur d'IDB et l'IDB du fichier
|
||||||
|
|
||||||
Block_indicateur=0x2C;
|
Block_indicateur=0x2C;
|
||||||
@ -3423,9 +3462,14 @@ void Save_GIF(void)
|
|||||||
GIF_Vider_le_buffer(); // On envoie les dernières données du buffer GIF dans le buffer KM
|
GIF_Vider_le_buffer(); // On envoie les dernières données du buffer GIF dans le buffer KM
|
||||||
Close_ecriture(GIF_Fichier); // On envoie les dernières données du buffer KM dans le fichier
|
Close_ecriture(GIF_Fichier); // On envoie les dernières données du buffer KM dans le fichier
|
||||||
|
|
||||||
Chaine_en_cours=0x3B00; // On écrit un GIF TERMINATOR, exigé par SVGA et SEA.
|
// On écrit un \0
|
||||||
if (! write_bytes(GIF_Fichier,&Chaine_en_cours,sizeof(Chaine_en_cours)))
|
if (! write_byte(GIF_Fichier,'\x00'))
|
||||||
Erreur_fichier=1;
|
Erreur_fichier=1;
|
||||||
|
// On écrit un GIF TERMINATOR, exigé par SVGA et SEA.
|
||||||
|
if (! write_byte(GIF_Fichier,'\x3B'))
|
||||||
|
Erreur_fichier=1;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // On a pu écrire l'IDB
|
} // On a pu écrire l'IDB
|
||||||
|
|||||||
@ -991,7 +991,7 @@ void Afficher_palette_du_menu_en_evitant_la_fenetre(byte * Table)
|
|||||||
{
|
{
|
||||||
// On part du principe qu'il n'y a que le bas d'une fenêtre qui puisse
|
// On part du principe qu'il n'y a que le bas d'une fenêtre qui puisse
|
||||||
// empiéter sur la palette... Et c'est déjà pas mal!
|
// empiéter sur la palette... Et c'est déjà pas mal!
|
||||||
byte Couleur,Vraie_couleur;
|
word Couleur,Vraie_couleur;
|
||||||
word Debut_X,Debut_Y;
|
word Debut_X,Debut_Y;
|
||||||
word Fin_X,Fin_Y;
|
word Fin_X,Fin_Y;
|
||||||
word Largeur;
|
word Largeur;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user