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:
Yves Rizoud 2009-02-10 20:18:45 +00:00
parent 17dbcfa61e
commit aaa393e12f
2 changed files with 203 additions and 159 deletions

View File

@ -115,7 +115,7 @@ void Save_PNG(void);
T_Format FormatFichier[NB_FORMATS_CONNUS] = {
{"pkm", Test_PKM, Load_PKM, Save_PKM, 1, 1},
{"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},
{"pcx", Test_PCX, Load_PCX, Save_PCX, 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
long Taille_du_fichier;
struct stat Informations_Fichier;
int Nombre_LID; // Nombre d'images trouvées dans le fichier
/////////////////////////////////////////////////// FIN DES DECLARATIONS //
@ -2855,6 +2855,7 @@ void Load_GIF(void)
GIF_Last_byte=0;
GIF_Rest_bits=0;
GIF_Rest_byte=0;
Nombre_LID=0;
Nom_fichier_complet(Nom_du_fichier,0);
@ -2927,37 +2928,60 @@ void Load_GIF(void)
Set_palette(Principal_Palette);
}
// On s'apprête à sauter tous les blocks d'extension:
// On lit un indicateur de block
read_byte(GIF_Fichier,&Block_indicateur);
// Si l'indicateur de block annonce un block d'extension:
while (Block_indicateur==0x21)
while (Block_indicateur!=0x3B && !Erreur_fichier)
{
switch (Block_indicateur)
{
case 0x21: // Bloc d'extension
{
byte Code_Fonction;
// Lecture du code de fonction:
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:
read_byte(GIF_Fichier,&Code_Fonction);
// Lecture de la taille du bloc:
read_byte(GIF_Fichier,&Taille_de_lecture);
while (Taille_de_lecture!=0)
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);
}
// Lecture du code de fonction suivant:
read_byte(GIF_Fichier,&Block_indicateur);
}
if (Block_indicateur==0x2C)
break;
case 0x2C: // Local Image Descriptor
{
// Présence d'un Image Separator Header
// 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))
@ -3082,11 +3106,13 @@ void Load_GIF(void)
} // Le fichier contenait un IDB
else
Erreur_fichier=2;
} // Le fichier contenait une image
else
Erreur_fichier=2;
}
default:
break;
}
// Lecture du code de fonction suivant:
read_byte(GIF_Fichier,&Block_indicateur);
}
} // Le fichier contenait un LSDB
else
Erreur_fichier=1;
@ -3221,7 +3247,7 @@ void Save_GIF(void)
if ((GIF_Fichier=fopen(Nom_du_fichier,"wb")))
{
// 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.
@ -3265,6 +3291,19 @@ void Save_GIF(void)
// Le jour où on se servira des blocks d'extensions pour placer
// 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
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
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.
if (! write_bytes(GIF_Fichier,&Chaine_en_cours,sizeof(Chaine_en_cours)))
// On écrit un \0
if (! write_byte(GIF_Fichier,'\x00'))
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

View File

@ -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
// 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 Fin_X,Fin_Y;
word Largeur;