Fixed endianness of PCX i/o, increased buffer size of file paths everywhere.

git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@141 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
Yves Rizoud 2008-09-13 00:24:25 +00:00
parent b3bcf1d841
commit 0eaba7e952
4 changed files with 162 additions and 213 deletions

View File

@ -378,7 +378,7 @@ byte Bouton_Quitter_Routine_locale(void)
{ {
short Bouton_clicke; short Bouton_clicke;
//byte Enregistrer; //byte Enregistrer;
char Nom_du_fichier[256]; static char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
byte Ancienne_forme_curseur; byte Ancienne_forme_curseur;
if (!Principal_Image_modifiee) if (!Principal_Image_modifiee)
@ -3210,8 +3210,8 @@ void Nom_fichier_backup(char * Nom, char * Nom_backup)
void Backup_du_fichier_sauvegarde(void) void Backup_du_fichier_sauvegarde(void)
{ {
char Nom_du_fichier[256]; // Nom complet du fichier char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier
char Nouveau_nom_du_fichier[256]; // Nom complet du fichier backup char Nouveau_nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier backup
Nom_fichier_complet(Nom_du_fichier,0); Nom_fichier_complet(Nom_du_fichier,0);
// Calcul du nom complet du fichier backup // Calcul du nom complet du fichier backup
@ -3324,7 +3324,7 @@ void Bouton_Save(void)
void Bouton_Autosave(void) void Bouton_Autosave(void)
{ {
byte Ancienne_forme_curseur; byte Ancienne_forme_curseur;
char Nom_du_fichier[256]; static char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
byte Le_fichier_existe; byte Le_fichier_existe;

View File

@ -45,6 +45,7 @@
#define NB_PAGES_UNDO_MAX 99 // Nombre maximal de pages d'undo #define NB_PAGES_UNDO_MAX 99 // Nombre maximal de pages d'undo
#define FACTEUR_DE_ZOOM_PAR_DEFAUT 4 // Facteur de zoom initial #define FACTEUR_DE_ZOOM_PAR_DEFAUT 4 // Facteur de zoom initial
#define NB_SECTIONS_AIDE 3 // Nombre de sections dans l'aide #define NB_SECTIONS_AIDE 3 // Nombre de sections dans l'aide
#define TAILLE_CHEMIN_FICHIER 2048 // Le nombre de caractères maxi pour un nom de fichier avec chemin complet
// On impose à l'allocation dynamique des pages de backups de conserver un // On impose à l'allocation dynamique des pages de backups de conserver un
// minimum de 256 Ko pour que le reste du programme puisse continuer à // minimum de 256 Ko pour que le reste du programme puisse continuer à

6
init.c
View File

@ -228,7 +228,7 @@ void Charger_DAT(void)
FILE* Handle; FILE* Handle;
int Taille_fichier; int Taille_fichier;
int Indice; int Indice;
char Nom_du_fichier[256]; char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
byte * Fonte_temporaire; byte * Fonte_temporaire;
byte Pos_X; byte Pos_X;
byte Pos_Y; byte Pos_Y;
@ -1753,7 +1753,7 @@ byte Numero_option[NB_TOUCHES]=
int Charger_CFG(int Tout_charger) int Charger_CFG(int Tout_charger)
{ {
FILE* Handle; FILE* Handle;
char Nom_du_fichier[256]; char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
long Taille_fichier; long Taille_fichier;
int Indice,Indice2; int Indice,Indice2;
struct Config_Header CFG_Header; struct Config_Header CFG_Header;
@ -1991,7 +1991,7 @@ int Sauver_CFG(void)
FILE* Handle; FILE* Handle;
int Indice; int Indice;
//byte Octet; //byte Octet;
char Nom_du_fichier[256]; char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
struct Config_Header CFG_Header; struct Config_Header CFG_Header;
struct Config_Chunk Chunk; struct Config_Chunk Chunk;
struct Config_Infos_touche CFG_Infos_touche; struct Config_Infos_touche CFG_Infos_touche;

View File

@ -32,58 +32,28 @@
#define PERMISSIONS_ECRITURE (S_IRUSR|S_IWUSR) #define PERMISSIONS_ECRITURE (S_IRUSR|S_IWUSR)
#endif #endif
// Lit un ou plusieurs word Little-Endian // Conversion des words d'une structure, si necessaire sur cette plate-forme
size_t read_word_le(int fd, word *buffer, size_t number) void Retraite_Word_LittleEndian(word ** Adresse)
{ {
size_t Charge = read(fd, buffer, number * sizeof(word)); #if SDL_BYTEORDER != SDL_LIL_ENDIAN
#if SDL_BYTEORDER != SDL_LIL_ENDIAN while (*Adresse != NULL)
{ {
int i; word ValeurConvertie = SDL_Swap16(**Adresse);
for (i = 0; i < number; i++) **Adresse = ValeurConvertie;
buffer[i] = SDL_Swap16(buffer[i]); Adresse++;
} }
#endif #endif
return Charge;
} }
// Lit un ou plusieurs word Big-Endian void Retraite_DWord_LittleEndian(dword * Adresse[])
size_t read_word_be(int fd, word *buffer, size_t number)
{ {
size_t Charge = read(fd, buffer, number * sizeof(word)); #if SDL_BYTEORDER != SDL_LIL_ENDIAN
#if SDL_BYTEORDER != SDL_BIG_ENDIAN while (*Adresse != NULL)
{ {
int i; dword ValeurConvertie = SDL_Swap32(**Adresse);
for (i = 0; i < number; i++) **Adresse = ValeurConvertie;
buffer[i] = SDL_Swap16(buffer[i]); Adresse++;
} }
#endif #endif
return Charge;
}
// Lit un ou plusieurs dword Little-Endian
size_t read_dword_le(int fd, dword *buffer, size_t number)
{
size_t Charge = read(fd, buffer, number * sizeof(dword));
#if SDL_BYTEORDER != SDL_LIL_ENDIAN
{
int i;
for (i = 0; i < number; i++)
buffer[i] = SDL_Swap32(buffer[i]);
}
#endif
return Charge;
}
// Lit un ou plusieurs dword Big-Endian
size_t read_dword_be(int fd, dword *buffer, size_t number)
{
size_t Charge = read(fd, buffer, number * sizeof(dword));
#if SDL_BYTEORDER != SDL_BIG_ENDIAN
{
int i;
for (i = 0; i < number; i++)
buffer[i] = SDL_Swap32(buffer[i]);
}
#endif
return Charge;
} }
// Chargement des pixels dans l'écran principal // Chargement des pixels dans l'écran principal
@ -671,7 +641,7 @@ void Sauver_image(byte Image)
void Test_PAL(void) void Test_PAL(void)
{ {
int Fichier; // Handle du fichier int Fichier; // Handle du fichier
char Nom_du_fichier[256]; // Nom complet du fichier char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier
long Taille_du_fichier; // Taille du fichier long Taille_du_fichier; // Taille du fichier
struct stat Informations_Fichier; struct stat Informations_Fichier;
@ -698,7 +668,7 @@ void Test_PAL(void)
void Load_PAL(void) void Load_PAL(void)
{ {
int Handle; // Handle du fichier int Handle; // Handle du fichier
char Nom_du_fichier[256]; // Nom complet du fichier char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier
//long Taille_du_fichier; // Taille du fichier //long Taille_du_fichier; // Taille du fichier
@ -736,7 +706,7 @@ void Load_PAL(void)
void Save_PAL(void) void Save_PAL(void)
{ {
int Fichier; // Handle du fichier int Fichier; // Handle du fichier
char Nom_du_fichier[256]; // Nom complet du fichier char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier
//long Taille_du_fichier; // Taille du fichier //long Taille_du_fichier; // Taille du fichier
Nom_fichier_complet(Nom_du_fichier,0); Nom_fichier_complet(Nom_du_fichier,0);
@ -781,7 +751,7 @@ void Save_PAL(void)
void Test_IMG(void) void Test_IMG(void)
{ {
int Handle; // Handle du fichier int Handle; // Handle du fichier
char Nom_du_fichier[256]; // Nom complet du fichier char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier
struct Header struct Header
{ {
byte Filler1[6]; byte Filler1[6];
@ -817,7 +787,7 @@ void Test_IMG(void)
// -- Lire un fichier au format IMG ----------------------------------------- // -- Lire un fichier au format IMG -----------------------------------------
void Load_IMG(void) void Load_IMG(void)
{ {
char Nom_du_fichier[256]; // Nom complet du fichier char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier
byte * Buffer; byte * Buffer;
int Fichier; int Fichier;
word Pos_X,Pos_Y; word Pos_X,Pos_Y;
@ -887,7 +857,7 @@ void Load_IMG(void)
// -- Sauver un fichier au format IMG --------------------------------------- // -- Sauver un fichier au format IMG ---------------------------------------
void Save_IMG(void) void Save_IMG(void)
{ {
char Nom_du_fichier[256]; // Nom complet du fichier char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier
int Fichier; int Fichier;
short Pos_X,Pos_Y; short Pos_X,Pos_Y;
struct Header struct Header
@ -964,7 +934,7 @@ void Save_IMG(void)
void Test_PKM(void) void Test_PKM(void)
{ {
int Fichier; // Handle du fichier int Fichier; // Handle du fichier
char Nom_du_fichier[256]; // Nom complet du fichier char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier
struct Header struct Header
{ {
char Ident[3]; // ChaŒne "PKM" } char Ident[3]; // ChaŒne "PKM" }
@ -1007,7 +977,7 @@ void Test_PKM(void)
void Load_PKM(void) void Load_PKM(void)
{ {
int Fichier; // Handle du fichier int Fichier; // Handle du fichier
char Nom_du_fichier[256]; // Nom complet du fichier char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier
struct Header struct Header
{ {
char Ident[3]; // ChaŒne "PKM" } char Ident[3]; // ChaŒne "PKM" }
@ -1249,7 +1219,7 @@ void Load_PKM(void)
void Save_PKM(void) void Save_PKM(void)
{ {
char Nom_du_fichier[256]; char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
int Fichier; int Fichier;
struct Header struct Header
{ {
@ -1431,7 +1401,7 @@ void Save_PKM(void)
void Test_LBM(void) void Test_LBM(void)
{ {
char Nom_du_fichier[256]; char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
char Format[4]; char Format[4];
char Section[4]; char Section[4];
@ -1678,7 +1648,7 @@ void Test_LBM(void)
void Load_LBM(void) void Load_LBM(void)
{ {
char Nom_du_fichier[256]; char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
//int Fichier; //int Fichier;
struct Header_LBM struct Header_LBM
{ {
@ -2048,7 +2018,7 @@ void Load_LBM(void)
void Save_LBM(void) void Save_LBM(void)
{ {
char Nom_du_fichier[256]; char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
struct Header_LBM struct Header_LBM
{ {
word Width; word Width;
@ -2207,7 +2177,7 @@ struct BMP_Header
// -- Tester si un fichier est au format BMP -------------------------------- // -- Tester si un fichier est au format BMP --------------------------------
void Test_BMP(void) void Test_BMP(void)
{ {
char Nom_du_fichier[256]; char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
int Fichier; int Fichier;
struct BMP_Header Header; struct BMP_Header Header;
@ -2247,7 +2217,7 @@ void Test_BMP(void)
// -- Charger un fichier au format BMP -------------------------------------- // -- Charger un fichier au format BMP --------------------------------------
void Load_BMP(void) void Load_BMP(void)
{ {
char Nom_du_fichier[256]; char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
int Fichier; int Fichier;
struct BMP_Header Header; struct BMP_Header Header;
byte * Buffer; byte * Buffer;
@ -2521,7 +2491,7 @@ void Load_BMP(void)
// -- Sauvegarder un fichier au format BMP ---------------------------------- // -- Sauvegarder un fichier au format BMP ----------------------------------
void Save_BMP(void) void Save_BMP(void)
{ {
char Nom_du_fichier[256]; char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
int Fichier; int Fichier;
struct BMP_Header struct BMP_Header
{ {
@ -2649,7 +2619,7 @@ void Save_BMP(void)
void Test_GIF(void) void Test_GIF(void)
{ {
char Nom_du_fichier[256]; char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
char Signature[6]; char Signature[6];
int Fichier; int Fichier;
@ -2769,7 +2739,7 @@ void Test_GIF(void)
void Load_GIF(void) void Load_GIF(void)
{ {
char Nom_du_fichier[256]; char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
char Signature[6]; char Signature[6];
word * Alphabet_Pile; // Pile de décodage d'une chaîne word * Alphabet_Pile; // Pile de décodage d'une chaîne
@ -3166,7 +3136,7 @@ void Load_GIF(void)
void Save_GIF(void) void Save_GIF(void)
{ {
char Nom_du_fichier[256]; char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
word * Alphabet_Prefixe; // Table des préfixes des codes word * Alphabet_Prefixe; // Table des préfixes des codes
word * Alphabet_Suffixe; // Table des suffixes des codes word * Alphabet_Suffixe; // Table des suffixes des codes
@ -3458,18 +3428,10 @@ void Save_GIF(void)
//////////////////////////////////// PCX //////////////////////////////////// //////////////////////////////////// PCX ////////////////////////////////////
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
typedef struct
// -- Tester si un fichier est au format PCX --------------------------------
void Test_PCX(void)
{
char Nom_du_fichier[256];
int Fichier;
struct PCX_Header
{ {
byte Manufacturer; // |_ Il font chier ces cons! Ils auraient pu byte Manufacturer; // |_ Il font chier ces cons! Ils auraient pu
byte Version; // | mettre une vraie signature significative! byte Version; // | mettre une vraie signature!
byte Compression; // L'image est-elle compressée? byte Compression; // L'image est-elle compressée?
byte Depth; // Nombre de bits pour coder un pixel (inutile puisqu'on se sert de Plane) byte Depth; // Nombre de bits pour coder un pixel (inutile puisqu'on se sert de Plane)
word X_min; // |_ Coin haut-gauche | word X_min; // |_ Coin haut-gauche |
@ -3480,32 +3442,56 @@ void Test_PCX(void)
word Y_dpi; // | l'image | aucun moniteur n'est pareil!) word Y_dpi; // | l'image | aucun moniteur n'est pareil!)
byte Palette_16c[48]; // Palette 16 coul (inutile pour 256c) (débile!) byte Palette_16c[48]; // Palette 16 coul (inutile pour 256c) (débile!)
byte Reserved; // Ca me plait ‡a aussi! byte Reserved; // Ca me plait ‡a aussi!
byte Plane; // 4 => 16c , 1 => 256c byte Plane; // 4 => 16c , 1 => 256c , ...
word Bytes_per_plane_line;// Doit toujours ˆtre pair word Bytes_per_plane_line;// Doit toujours être pair
word Palette_info; // 1 => Couleur , 2 => Gris (ignoré à partir de la version 4) word Palette_info; // 1 => Couleur , 2 => Gris (ignoré à partir de la version 4)
word Screen_X; // |_ Dimensions de word Screen_X; // |_ Dimensions de
word Screen_Y; // | l'écran d'origine word Screen_Y; // | l'écran d'origine
byte Filler[54]; // Ca... J'adore! byte Filler[54]; // Ca... J'adore!
} Header; // Je hais ce header! } __attribute__((__packed__)) T_PCX_Header;
T_PCX_Header PCX_Header;
word * PCX_words[] = {
&PCX_Header.X_min,
&PCX_Header.Y_min,
&PCX_Header.X_max,
&PCX_Header.Y_max,
&PCX_Header.X_dpi,
&PCX_Header.Y_dpi,
&PCX_Header.Bytes_per_plane_line,
&PCX_Header.Palette_info,
&PCX_Header.Screen_X,
&PCX_Header.Screen_Y,
NULL
};
// -- Tester si un fichier est au format PCX --------------------------------
void Test_PCX(void)
{
char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
int Fichier;
Erreur_fichier=0; Erreur_fichier=0;
Nom_fichier_complet(Nom_du_fichier,0); Nom_fichier_complet(Nom_du_fichier,0);
if ((Fichier=open(Nom_du_fichier,O_RDONLY|O_BINARY))!=-1) if ((Fichier=open(Nom_du_fichier,O_RDONLY|O_BINARY))!=-1)
{ {
if (read(Fichier,&Header,sizeof(struct PCX_Header))==sizeof(struct PCX_Header)) if (read(Fichier,&PCX_Header,sizeof(T_PCX_Header))==sizeof(T_PCX_Header))
{ {
Retraite_Word_LittleEndian(PCX_words);
// Vu que ce header a une signature de merde et peu significative, il // Vu que ce header a une signature de merde et peu significative, il
// va falloir que je teste différentes petites valeurs dont je connais // va falloir que je teste différentes petites valeurs dont je connais
// l'intervalle. Grrr! // l'intervalle. Grrr!
if ( (Header.Manufacturer!=10) if ( (PCX_Header.Manufacturer!=10)
|| (Header.Compression>1) || (PCX_Header.Compression>1)
|| ( (Header.Depth!=1) && (Header.Depth!=2) && (Header.Depth!=4) && (Header.Depth!=8) ) || ( (PCX_Header.Depth!=1) && (PCX_Header.Depth!=2) && (PCX_Header.Depth!=4) && (PCX_Header.Depth!=8) )
|| ( (Header.Plane!=1) && (Header.Plane!=2) && (Header.Plane!=4) && (Header.Plane!=8) && (Header.Plane!=3) ) || ( (PCX_Header.Plane!=1) && (PCX_Header.Plane!=2) && (PCX_Header.Plane!=4) && (PCX_Header.Plane!=8) && (PCX_Header.Plane!=3) )
|| (Header.X_max<Header.X_min) || (PCX_Header.X_max<PCX_Header.X_min)
|| (Header.Y_max<Header.Y_min) || (PCX_Header.Y_max<PCX_Header.Y_min)
|| (Header.Bytes_per_plane_line&1) ) || (PCX_Header.Bytes_per_plane_line&1) )
Erreur_fichier=1; Erreur_fichier=1;
} }
else else
@ -3536,29 +3522,9 @@ void Test_PCX(void)
void Load_PCX(void) void Load_PCX(void)
{ {
char Nom_du_fichier[256]; char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
int Fichier; int Fichier;
struct PCX_Header
{
byte Manufacturer; // |_ Il font chier ces cons! Ils auraient pu
byte Version; // | mettre une vraie signature!
byte Compression; // L'image est-elle compressée?
byte Depth; // Nombre de bits pour coder un pixel (inutile puisqu'on se sert de Plane)
word X_min; // |_ Coin haut-gauche |
word Y_min; // | de l'image |_ (Crétin!)
word X_max; // |_ Coin bas-droit |
word Y_max; // | de l'image |
word X_dpi; // |_ Densité de |_ (Presque inutile parce que
word Y_dpi; // | l'image | aucun moniteur n'est pareil!)
byte Palette_16c[48]; // Palette 16 coul (inutile pour 256c) (débile!)
byte Reserved; // Ca me plait ‡a aussi!
byte Plane; // 4 => 16c , 1 => 256c , ...
word Bytes_per_plane_line;// Doit toujours être pair
word Palette_info; // 1 => Couleur , 2 => Gris (ignoré à partir de la version 4)
word Screen_X; // |_ Dimensions de
word Screen_Y; // | l'écran d'origine
byte Filler[54]; // Ca... J'adore!
} __attribute__((__packed__)) Header; // Je hais ce header!
short Taille_ligne; short Taille_ligne;
short Vraie_taille_ligne; // Largeur de l'image corrigée short Vraie_taille_ligne; // Largeur de l'image corrigée
short Largeur_lue; short Largeur_lue;
@ -3586,18 +3552,18 @@ void Load_PCX(void)
stat(Nom_du_fichier,&Informations_Fichier); stat(Nom_du_fichier,&Informations_Fichier);
Taille_du_fichier=Informations_Fichier.st_size; Taille_du_fichier=Informations_Fichier.st_size;
if (read(Fichier,&Header,sizeof(struct PCX_Header))==sizeof(struct PCX_Header)) if (read(Fichier,&PCX_Header,sizeof(T_PCX_Header))==sizeof(T_PCX_Header))
{ {
// Ce format est Little-Endian // Ce format est Little-Endian
//SDL_SwapLE16(Header.); Retraite_Word_LittleEndian(PCX_words);
Principal_Largeur_image=Header.X_max-Header.X_min+1; Principal_Largeur_image=PCX_Header.X_max-PCX_Header.X_min+1;
Principal_Hauteur_image=Header.Y_max-Header.Y_min+1; Principal_Hauteur_image=PCX_Header.Y_max-PCX_Header.Y_min+1;
Ecran_original_X=Header.Screen_X; Ecran_original_X=PCX_Header.Screen_X;
Ecran_original_Y=Header.Screen_Y; Ecran_original_Y=PCX_Header.Screen_Y;
if (Header.Plane!=3) if (PCX_Header.Plane!=3)
{ {
Initialiser_preview(Principal_Largeur_image,Principal_Hauteur_image,Taille_du_fichier,FORMAT_PCX); Initialiser_preview(Principal_Largeur_image,Principal_Hauteur_image,Taille_du_fichier,FORMAT_PCX);
if (Erreur_fichier==0) if (Erreur_fichier==0)
@ -3607,16 +3573,16 @@ void Load_PCX(void)
memset(Principal_Palette,0,sizeof(T_Palette)); memset(Principal_Palette,0,sizeof(T_Palette));
else else
Palette_64_to_256(Principal_Palette); Palette_64_to_256(Principal_Palette);
Nb_couleurs=(dword)(1<<Header.Plane)<<(Header.Depth-1); Nb_couleurs=(dword)(1<<PCX_Header.Plane)<<(PCX_Header.Depth-1);
if (Nb_couleurs>4) if (Nb_couleurs>4)
memcpy(Principal_Palette,Header.Palette_16c,48); memcpy(Principal_Palette,PCX_Header.Palette_16c,48);
else else
{ {
Principal_Palette[1].R=0; Principal_Palette[1].R=0;
Principal_Palette[1].V=0; Principal_Palette[1].V=0;
Principal_Palette[1].B=0; Principal_Palette[1].B=0;
Octet1=Header.Palette_16c[3]>>5; Octet1=PCX_Header.Palette_16c[3]>>5;
if (Nb_couleurs==4) if (Nb_couleurs==4)
{ // Pal. CGA "alakon" (du Turc Allahkoum qui signifie "à la con" :)) { // Pal. CGA "alakon" (du Turc Allahkoum qui signifie "à la con" :))
memcpy(Principal_Palette+1,Palette_CGA,9); memcpy(Principal_Palette+1,Palette_CGA,9);
@ -3637,7 +3603,7 @@ void Load_PCX(void)
// On se positionne à la fin du fichier - 769 octets pour voir s'il y // On se positionne à la fin du fichier - 769 octets pour voir s'il y
// a une palette. // a une palette.
if ( (Header.Depth==8) && (Header.Version>=5) && (Taille_du_fichier>(256*3)) ) if ( (PCX_Header.Depth==8) && (PCX_Header.Version>=5) && (Taille_du_fichier>(256*3)) )
{ {
lseek(Fichier,Taille_du_fichier-((256*3)+1),SEEK_SET); lseek(Fichier,Taille_du_fichier-((256*3)+1),SEEK_SET);
// On regarde s'il y a une palette après les données de l'image // On regarde s'il y a une palette après les données de l'image
@ -3667,22 +3633,22 @@ void Load_PCX(void)
if (!Erreur_fichier) if (!Erreur_fichier)
{ {
Taille_ligne=Header.Bytes_per_plane_line*Header.Plane; Taille_ligne=PCX_Header.Bytes_per_plane_line*PCX_Header.Plane;
Vraie_taille_ligne=(short)Header.Bytes_per_plane_line<<3; Vraie_taille_ligne=(short)PCX_Header.Bytes_per_plane_line<<3;
// On se sert de données LBM car le dessin de ligne en moins de 256 // On se sert de données LBM car le dessin de ligne en moins de 256
// couleurs se fait comme avec la structure ILBM. // couleurs se fait comme avec la structure ILBM.
Image_HAM=0; Image_HAM=0;
HBPm1=Header.Plane-1; HBPm1=PCX_Header.Plane-1;
LBM_Buffer=(byte *)malloc(Taille_ligne); LBM_Buffer=(byte *)malloc(Taille_ligne);
// Chargement de l'image // Chargement de l'image
if (Header.Compression) // Image compressée if (PCX_Header.Compression) // Image compressée
{ {
Init_lecture(); Init_lecture();
Taille_image=(long)Header.Bytes_per_plane_line*Principal_Hauteur_image; Taille_image=(long)PCX_Header.Bytes_per_plane_line*Principal_Hauteur_image;
if (Header.Depth==8) // 256 couleurs (1 plan) if (PCX_Header.Depth==8) // 256 couleurs (1 plan)
{ {
for (Position=0; ((Position<Taille_image) && (!Erreur_fichier));) for (Position=0; ((Position<Taille_image) && (!Erreur_fichier));)
{ {
@ -3744,10 +3710,10 @@ void Load_PCX(void)
} }
} }
// Affichage de la ligne par plan du buffer // Affichage de la ligne par plan du buffer
if (Header.Depth==1) if (PCX_Header.Depth==1)
Draw_ILBM_line(Pos_Y,Vraie_taille_ligne); Draw_ILBM_line(Pos_Y,Vraie_taille_ligne);
else else
Draw_PCX_line(Pos_Y,Vraie_taille_ligne,Header.Depth); Draw_PCX_line(Pos_Y,Vraie_taille_ligne,PCX_Header.Depth);
} }
} }
@ -3759,15 +3725,15 @@ void Load_PCX(void)
{ {
if ((Largeur_lue=read(Fichier,LBM_Buffer,Taille_ligne))==Taille_ligne) if ((Largeur_lue=read(Fichier,LBM_Buffer,Taille_ligne))==Taille_ligne)
{ {
if (Header.Plane==1) if (PCX_Header.Plane==1)
for (Pos_X=0; Pos_X<Principal_Largeur_image;Pos_X++) for (Pos_X=0; Pos_X<Principal_Largeur_image;Pos_X++)
Pixel_de_chargement(Pos_X,Pos_Y,LBM_Buffer[Pos_X]); Pixel_de_chargement(Pos_X,Pos_Y,LBM_Buffer[Pos_X]);
else else
{ {
if (Header.Depth==1) if (PCX_Header.Depth==1)
Draw_ILBM_line(Pos_Y,Vraie_taille_ligne); Draw_ILBM_line(Pos_Y,Vraie_taille_ligne);
else else
Draw_PCX_line(Pos_Y,Vraie_taille_ligne,Header.Depth); Draw_PCX_line(Pos_Y,Vraie_taille_ligne,PCX_Header.Depth);
} }
} }
else else
@ -3787,17 +3753,17 @@ void Load_PCX(void)
if (Erreur_fichier==0) if (Erreur_fichier==0)
{ {
Taille_ligne=Header.Bytes_per_plane_line*3; Taille_ligne=PCX_Header.Bytes_per_plane_line*3;
Buffer=(byte *)malloc(Taille_ligne); Buffer=(byte *)malloc(Taille_ligne);
if (!Header.Compression) if (!PCX_Header.Compression)
{ {
for (Pos_Y=0;(Pos_Y<Principal_Hauteur_image) && (!Erreur_fichier);Pos_Y++) for (Pos_Y=0;(Pos_Y<Principal_Hauteur_image) && (!Erreur_fichier);Pos_Y++)
{ {
if (read(Fichier,Buffer,Taille_ligne)==Taille_ligne) if (read(Fichier,Buffer,Taille_ligne)==Taille_ligne)
{ {
for (Pos_X=0; Pos_X<Principal_Largeur_image; Pos_X++) for (Pos_X=0; Pos_X<Principal_Largeur_image; Pos_X++)
Pixel_Chargement_24b(Pos_X,Pos_Y,Buffer[Pos_X+(Header.Bytes_per_plane_line*0)],Buffer[Pos_X+(Header.Bytes_per_plane_line*1)],Buffer[Pos_X+(Header.Bytes_per_plane_line*2)]); Pixel_Chargement_24b(Pos_X,Pos_Y,Buffer[Pos_X+(PCX_Header.Bytes_per_plane_line*0)],Buffer[Pos_X+(PCX_Header.Bytes_per_plane_line*1)],Buffer[Pos_X+(PCX_Header.Bytes_per_plane_line*2)]);
} }
else else
Erreur_fichier=2; Erreur_fichier=2;
@ -3825,7 +3791,7 @@ void Load_PCX(void)
if (Position>=Taille_ligne) if (Position>=Taille_ligne)
{ {
for (Pos_X=0; Pos_X<Principal_Largeur_image; Pos_X++) for (Pos_X=0; Pos_X<Principal_Largeur_image; Pos_X++)
Pixel_Chargement_24b(Pos_X,Pos_Y,Buffer[Pos_X+(Header.Bytes_per_plane_line*0)],Buffer[Pos_X+(Header.Bytes_per_plane_line*1)],Buffer[Pos_X+(Header.Bytes_per_plane_line*2)]); Pixel_Chargement_24b(Pos_X,Pos_Y,Buffer[Pos_X+(PCX_Header.Bytes_per_plane_line*0)],Buffer[Pos_X+(PCX_Header.Bytes_per_plane_line*1)],Buffer[Pos_X+(PCX_Header.Bytes_per_plane_line*2)]);
Pos_Y++; Pos_Y++;
Position=0; Position=0;
} }
@ -3838,7 +3804,7 @@ void Load_PCX(void)
if (Position>=Taille_ligne) if (Position>=Taille_ligne)
{ {
for (Pos_X=0; Pos_X<Principal_Largeur_image; Pos_X++) for (Pos_X=0; Pos_X<Principal_Largeur_image; Pos_X++)
Pixel_Chargement_24b(Pos_X,Pos_Y,Buffer[Pos_X+(Header.Bytes_per_plane_line*0)],Buffer[Pos_X+(Header.Bytes_per_plane_line*1)],Buffer[Pos_X+(Header.Bytes_per_plane_line*2)]); Pixel_Chargement_24b(Pos_X,Pos_Y,Buffer[Pos_X+(PCX_Header.Bytes_per_plane_line*0)],Buffer[Pos_X+(PCX_Header.Bytes_per_plane_line*1)],Buffer[Pos_X+(PCX_Header.Bytes_per_plane_line*2)]);
Pos_Y++; Pos_Y++;
Position=0; Position=0;
} }
@ -3868,29 +3834,9 @@ void Load_PCX(void)
void Save_PCX(void) void Save_PCX(void)
{ {
char Nom_du_fichier[256]; char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
int Fichier; int Fichier;
struct PCX_Header
{
byte Manufacturer;
byte Version;
byte Compression;
byte Depth;
word X_min;
word Y_min;
word X_max;
word Y_max;
word X_dpi;
word Y_dpi;
byte Palette_16c[48];
byte Reserved;
byte Plane;
word Bytes_per_plane_line;
word Palette_info;
word Screen_X;
word Screen_Y;
byte Filler[54];
} Header;
short Taille_ligne; short Taille_ligne;
short Pos_X; short Pos_X;
short Pos_Y; short Pos_Y;
@ -3909,28 +3855,30 @@ void Save_PCX(void)
// On prépare la palette pour écrire les 16 premieres valeurs // On prépare la palette pour écrire les 16 premieres valeurs
Palette_64_to_256(Principal_Palette); Palette_64_to_256(Principal_Palette);
Header.Manufacturer=10; PCX_Header.Manufacturer=10;
Header.Version=5; PCX_Header.Version=5;
Header.Compression=1; PCX_Header.Compression=1;
Header.Depth=8; PCX_Header.Depth=8;
Header.X_min=0; PCX_Header.X_min=0;
Header.Y_min=0; PCX_Header.Y_min=0;
Header.X_max=Principal_Largeur_image-1; PCX_Header.X_max=Principal_Largeur_image-1;
Header.Y_max=Principal_Hauteur_image-1; PCX_Header.Y_max=Principal_Hauteur_image-1;
Header.X_dpi=0; PCX_Header.X_dpi=0;
Header.Y_dpi=0; PCX_Header.Y_dpi=0;
memcpy(Header.Palette_16c,Principal_Palette,48); memcpy(PCX_Header.Palette_16c,Principal_Palette,48);
Header.Reserved=0; PCX_Header.Reserved=0;
Header.Plane=1; PCX_Header.Plane=1;
Header.Bytes_per_plane_line=(Principal_Largeur_image&1)?Principal_Largeur_image+1:Principal_Largeur_image; PCX_Header.Bytes_per_plane_line=(Principal_Largeur_image&1)?Principal_Largeur_image+1:Principal_Largeur_image;
Header.Palette_info=1; PCX_Header.Palette_info=1;
Header.Screen_X=Largeur_ecran; PCX_Header.Screen_X=Largeur_ecran;
Header.Screen_Y=Hauteur_ecran; PCX_Header.Screen_Y=Hauteur_ecran;
memset(Header.Filler,0,54); memset(PCX_Header.Filler,0,54);
if (write(Fichier,&Header,sizeof(struct PCX_Header))!=-1) Retraite_Word_LittleEndian(PCX_words);
if (write(Fichier,&PCX_Header,sizeof(T_PCX_Header))!=-1)
{ {
Taille_ligne=Header.Bytes_per_plane_line*Header.Plane; Retraite_Word_LittleEndian(PCX_words);
Taille_ligne=PCX_Header.Bytes_per_plane_line*PCX_Header.Plane;
Init_ecriture(); Init_ecriture();
@ -3999,7 +3947,7 @@ void Save_PCX(void)
void Test_CEL(void) void Test_CEL(void)
{ {
char Nom_du_fichier[256]; char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
int Taille; int Taille;
int Fichier; int Fichier;
struct CEL_Header1 struct CEL_Header1
@ -4065,7 +4013,7 @@ void Test_CEL(void)
void Load_CEL(void) void Load_CEL(void)
{ {
char Nom_du_fichier[256]; char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
int Fichier; int Fichier;
struct CEL_Header1 struct CEL_Header1
{ {
@ -4197,7 +4145,7 @@ void Load_CEL(void)
void Save_CEL(void) void Save_CEL(void)
{ {
char Nom_du_fichier[256]; char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
int Fichier; int Fichier;
struct CEL_Header1 struct CEL_Header1
{ {
@ -4329,7 +4277,7 @@ void Save_CEL(void)
void Test_KCF(void) void Test_KCF(void)
{ {
char Nom_du_fichier[256]; char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
int Fichier; int Fichier;
struct KCF_Header struct KCF_Header
{ {
@ -4396,7 +4344,7 @@ void Test_KCF(void)
void Load_KCF(void) void Load_KCF(void)
{ {
char Nom_du_fichier[256]; char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
int Fichier; int Fichier;
struct KCF_Header struct KCF_Header
{ {
@ -4531,7 +4479,7 @@ void Load_KCF(void)
void Save_KCF(void) void Save_KCF(void)
{ {
char Nom_du_fichier[256]; char Nom_du_fichier[TAILLE_CHEMIN_FICHIER];
int Fichier; int Fichier;
struct KCF_Header struct KCF_Header
{ {
@ -4641,7 +4589,7 @@ void Save_KCF(void)
void Test_SCx(void) void Test_SCx(void)
{ {
int Handle; // Handle du fichier int Handle; // Handle du fichier
char Nom_du_fichier[256]; // Nom complet du fichier char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier
//byte Signature[3]; //byte Signature[3];
struct Header struct Header
{ {
@ -4677,7 +4625,7 @@ void Test_SCx(void)
// -- Lire un fichier au format SCx ----------------------------------------- // -- Lire un fichier au format SCx -----------------------------------------
void Load_SCx(void) void Load_SCx(void)
{ {
char Nom_du_fichier[256]; // Nom complet du fichier char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier
int Fichier; int Fichier;
word Pos_X,Pos_Y; word Pos_X,Pos_Y;
long Taille,Vraie_taille; long Taille,Vraie_taille;
@ -4770,7 +4718,7 @@ void Load_SCx(void)
// -- Sauver un fichier au format SCx --------------------------------------- // -- Sauver un fichier au format SCx ---------------------------------------
void Save_SCx(void) void Save_SCx(void)
{ {
char Nom_du_fichier[256]; // Nom complet du fichier char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier
int Fichier; int Fichier;
short Pos_X,Pos_Y; short Pos_X,Pos_Y;
struct Header struct Header
@ -4951,7 +4899,7 @@ void PI1_Coder_palette(byte * Pal,byte * Dst)
void Test_PI1(void) void Test_PI1(void)
{ {
int Handle; // Handle du fichier int Handle; // Handle du fichier
char Nom_du_fichier[256]; // Nom complet du fichier char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier
int Taille; // Taille du fichier int Taille; // Taille du fichier
word Res; // Résolution de l'image word Res; // Résolution de l'image
@ -4984,7 +4932,7 @@ void Test_PI1(void)
// -- Lire un fichier au format PI1 ----------------------------------------- // -- Lire un fichier au format PI1 -----------------------------------------
void Load_PI1(void) void Load_PI1(void)
{ {
char Nom_du_fichier[256]; // Nom complet du fichier char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier
int Fichier; int Fichier;
word Pos_X,Pos_Y; word Pos_X,Pos_Y;
byte * buffer; byte * buffer;
@ -5047,7 +4995,7 @@ void Load_PI1(void)
// -- Sauver un fichier au format PI1 --------------------------------------- // -- Sauver un fichier au format PI1 ---------------------------------------
void Save_PI1(void) void Save_PI1(void)
{ {
char Nom_du_fichier[256]; // Nom complet du fichier char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier
int Fichier; int Fichier;
short Pos_X,Pos_Y; short Pos_X,Pos_Y;
byte * buffer; byte * buffer;
@ -5281,7 +5229,7 @@ void PC1_1lp_to_4pb(byte * Src,byte * Dst0,byte * Dst1,byte * Dst2,byte * Dst3)
void Test_PC1(void) void Test_PC1(void)
{ {
int Handle; // Handle du fichier int Handle; // Handle du fichier
char Nom_du_fichier[256]; // Nom complet du fichier char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier
int Taille; // Taille du fichier int Taille; // Taille du fichier
word Res; // Résolution de l'image word Res; // Résolution de l'image
@ -5314,7 +5262,7 @@ void Test_PC1(void)
// -- Lire un fichier au format PC1 ----------------------------------------- // -- Lire un fichier au format PC1 -----------------------------------------
void Load_PC1(void) void Load_PC1(void)
{ {
char Nom_du_fichier[256]; // Nom complet du fichier char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier
int Fichier; int Fichier;
int Taille; int Taille;
word Pos_X,Pos_Y; word Pos_X,Pos_Y;
@ -5388,7 +5336,7 @@ void Load_PC1(void)
// -- Sauver un fichier au format PC1 --------------------------------------- // -- Sauver un fichier au format PC1 ---------------------------------------
void Save_PC1(void) void Save_PC1(void)
{ {
char Nom_du_fichier[256]; // Nom complet du fichier char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier
int Fichier; int Fichier;
int Taille; int Taille;
short Pos_X,Pos_Y; short Pos_X,Pos_Y;