From 2f5c16a8a0b8773c95dcfa3604bf5d83b38a9374 Mon Sep 17 00:00:00 2001 From: Yves Rizoud Date: Sun, 14 Sep 2008 18:07:17 +0000 Subject: [PATCH] Support for long file names in file selector, up to 27char. Cleanup in the Load/Save function for all formats, preparing for big endianness fix. git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@146 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- boutons.c | 103 ++++++----- const.h | 2 +- files.c | 202 +++++++++++--------- global.h | 22 +-- loadsave.c | 529 ++++++++++++++++++----------------------------------- main.c | 4 +- struct.h | 7 +- 7 files changed, 362 insertions(+), 507 deletions(-) diff --git a/boutons.c b/boutons.c index 46b2424b..83a13401 100644 --- a/boutons.c +++ b/boutons.c @@ -30,6 +30,8 @@ #define rmdir(x) DeleteFile(x) #endif +#define FILENAMESPACE 16 + //-- MODELE DE BOUTON DE MENU ------------------------------------------------ /* void Bouton_***(void) @@ -2130,8 +2132,8 @@ void Print_Nom_fichier_dans_selecteur(void) // Affiche Principal_Nom_fichier dans le Fileselect // { - Block(Fenetre_Pos_X+(Menu_Facteur_X*202),Fenetre_Pos_Y+(Menu_Facteur_Y*73),Menu_Facteur_X*96,Menu_Facteur_Y<<3,CM_Clair); - Print_dans_fenetre(202,73,Principal_Nom_fichier,CM_Noir,CM_Clair); + Block(Fenetre_Pos_X+(Menu_Facteur_X*(13+9*8)),Fenetre_Pos_Y+(Menu_Facteur_Y*90),Menu_Facteur_X*(27*8),Menu_Facteur_Y<<3,CM_Clair); + Print_dans_fenetre(13+9*8,90,Principal_Nom_fichier,CM_Noir,CM_Clair); } @@ -2156,7 +2158,7 @@ void Preparer_et_afficher_liste_fichiers(short Position, short Decalage, Calculer_hauteur_curseur_jauge(Enreg); Fenetre_Dessiner_jauge(Enreg); // On efface les anciens noms de fichier: - Block(Fenetre_Pos_X+(Menu_Facteur_X<<3),Fenetre_Pos_Y+(Menu_Facteur_Y*89),Menu_Facteur_X*98,Menu_Facteur_Y*82,CM_Noir); + Block(Fenetre_Pos_X+(Menu_Facteur_X<<3),Fenetre_Pos_Y+(Menu_Facteur_Y*(89+FILENAMESPACE)),Menu_Facteur_X*98,Menu_Facteur_Y*82,CM_Noir); // On affiche les nouveaux: Afficher_la_liste_des_fichiers(Position,Decalage); @@ -2179,7 +2181,7 @@ void Relire_liste_fichiers(byte Filtre, short Position, short Decalage, void On_vient_de_scroller_dans_le_fileselect(struct Fenetre_Bouton_scroller * Scroller_de_fichiers) { - char Ancien_nom_de_fichier[13]; + char Ancien_nom_de_fichier[TAILLE_CHEMIN_FICHIER]; strcpy(Ancien_nom_de_fichier,Principal_Nom_fichier); @@ -2207,7 +2209,7 @@ short Position_fichier_dans_liste(char * Nom) short Indice; for (Indice=0, Element_courant=Liste_du_fileselect; - ((Element_courant!=NULL) && (strcmp(Element_courant->Nom,Nom))); + ((Element_courant!=NULL) && (strcmp(Element_courant->NomComplet,Nom))); Indice++,Element_courant=Element_courant->Suivant); return (Element_courant!=NULL)?Indice:0; @@ -2241,10 +2243,10 @@ void Placer_barre_de_selection_sur(char * Nom) } -char FFF_Meilleur_nom[13]; +char FFF_Meilleur_nom[TAILLE_CHEMIN_FICHIER]; char * Nom_correspondant_le_mieux_a(char * Nom) { - char Nom_courant[13]; + char Nom_courant[TAILLE_CHEMIN_FICHIER]; char * Pointeur1; char * Pointeur2; char * Pointeur_Meilleur_nom; @@ -2262,7 +2264,7 @@ char * Nom_correspondant_le_mieux_a(char * Nom) { // On copie le nom de la liste en cours de traitement dans Nom_courant // tout en le remettant sous forme normale. - for (Pointeur1=Element_courant->Nom,Pointeur2=Nom_courant;*Pointeur1;Pointeur1++) + for (Pointeur1=Element_courant->NomComplet,Pointeur2=Nom_courant;*Pointeur1;Pointeur1++) if (*Pointeur1!=' ') *(Pointeur2++)=*Pointeur1; *Pointeur2=0; @@ -2272,7 +2274,7 @@ char * Nom_correspondant_le_mieux_a(char * Nom) { Lettres_identiques=Compteur; strcpy(FFF_Meilleur_nom,Nom_courant); - Pointeur_Meilleur_nom=Element_courant->Nom; + Pointeur_Meilleur_nom=Element_courant->NomComplet; } } } @@ -2299,10 +2301,10 @@ byte Bouton_Load_ou_Save(byte Load, byte Image) short Largeur_image_initiale; // |- être restaurées en sortant, short Hauteur_image_initiale; // | parce que la preview elle les byte Back_color_initiale; // | fout en l'air (c'te conne). - char Nom_fichier_initial[13]; // Sert à laisser le nom courant du fichier en cas de sauvegarde - char Repertoire_precedent[13]; // Répertoire d'où l'on vient après un CHDIR + char Nom_fichier_initial[TAILLE_CHEMIN_FICHIER]; // Sert à laisser le nom courant du fichier en cas de sauvegarde + char Repertoire_precedent[TAILLE_CHEMIN_FICHIER]; // Répertoire d'où l'on vient après un CHDIR char Commentaire_initial[TAILLE_COMMENTAIRE+1]; - char Fichier_recherche[13]=""; + char Fichier_recherche[TAILLE_CHEMIN_FICHIER]=""; char * Fichier_le_plus_ressemblant; Palette_initiale=(struct Composantes *)malloc(sizeof(T_Palette)); @@ -2317,18 +2319,18 @@ byte Bouton_Load_ou_Save(byte Load, byte Image) if (Load) { if (Image) - Ouvrir_fenetre(310,190,"Load picture"); + Ouvrir_fenetre(310,190+FILENAMESPACE,"Load picture"); else - Ouvrir_fenetre(310,190,"Load brush"); - Fenetre_Definir_bouton_normal(125,157,51,14,"Load",0,1,0x001C); // 1 + Ouvrir_fenetre(310,190+FILENAMESPACE,"Load brush"); + Fenetre_Definir_bouton_normal(125,157+FILENAMESPACE,51,14,"Load",0,1,0x001C); // 1 } else { if (Image) - Ouvrir_fenetre(310,190,"Save picture"); + Ouvrir_fenetre(310,190+FILENAMESPACE,"Save picture"); else - Ouvrir_fenetre(310,190,"Save brush"); - Fenetre_Definir_bouton_normal(125,157,51,14,"Save",0,1,0x001C); // 1 + Ouvrir_fenetre(310,190+FILENAMESPACE,"Save brush"); + Fenetre_Definir_bouton_normal(125,157+FILENAMESPACE,51,14,"Save",0,1,0x001C); // 1 if (Principal_Format==0) // Correction du *.* { Principal_Format=Principal_Format_fichier; @@ -2344,41 +2346,44 @@ byte Bouton_Load_ou_Save(byte Load, byte Image) } // Affichage du commentaire if (Format_Commentaire[Principal_Format-1]) - Print_dans_fenetre(46,176,Principal_Commentaire,CM_Noir,CM_Clair); + Print_dans_fenetre(46,176+FILENAMESPACE,Principal_Commentaire,CM_Noir,CM_Clair); } - Fenetre_Definir_bouton_normal(125,139,51,14,"Cancel",0,1,0x0001); // 2 - Fenetre_Definir_bouton_normal(125, 89,51,14,"Delete",0,1,0x0053); // 3 + Fenetre_Definir_bouton_normal(125,139+FILENAMESPACE,51,14,"Cancel",0,1,0x0001); // 2 + Fenetre_Definir_bouton_normal(125, 89+FILENAMESPACE,51,14,"Delete",0,1,0x0053); // 3 // Câdre autour des formats Fenetre_Afficher_cadre( 7, 51,103, 35); // Câdre autour des infos sur le fichier de dessin Fenetre_Afficher_cadre(116, 51,187, 35); // Câdre autour de la preview - Fenetre_Afficher_cadre_creux(179,88,124,84); + Fenetre_Afficher_cadre_creux(179,88+FILENAMESPACE,124,84); // Câdre autour du fileselector - Fenetre_Afficher_cadre_creux( 7,88,100,84); + Fenetre_Afficher_cadre_creux( 7,88+FILENAMESPACE,100,84); - Fenetre_Definir_bouton_special(9,90,96,80); // 4 + Fenetre_Definir_bouton_special(9,90+FILENAMESPACE,96,80); // 4 // Scroller du fileselector - Fenetre_Definir_bouton_scroller(110,89,82,1,10,0); // 5 + Fenetre_Definir_bouton_scroller(110,89+FILENAMESPACE,82,1,10,0); // 5 Scroller_de_fichiers=Fenetre_Liste_boutons_scroller; // Scroller des formats Fenetre_Definir_bouton_scroller(12,55,27,(Load)?NB_FORMATS_LOAD+1:NB_FORMATS_SAVE,1,(Load)?Principal_Format:Principal_Format-1); // 6 // Texte de commentaire des dessins - Print_dans_fenetre(7,176,"Txt:",CM_Fonce,CM_Clair); - Fenetre_Definir_bouton_saisie(44,174,TAILLE_COMMENTAIRE); // 7 + Print_dans_fenetre(7,176+FILENAMESPACE,"Txt:",CM_Fonce,CM_Clair); + Fenetre_Definir_bouton_saisie(44,174+FILENAMESPACE,TAILLE_COMMENTAIRE); // 7 + // Cadre autour du nom de fichier + //Fenetre_Afficher_cadre_creux( 7,87,296,15); + Print_dans_fenetre(9,90,"Filename:",CM_Fonce,CM_Clair); // Saisie du nom de fichier - Fenetre_Definir_bouton_saisie(200,71,12); // 8 + Fenetre_Definir_bouton_saisie(11+9*8,88,27); // 8 Print_dans_fenetre( 27,65,"Format:",CM_Fonce,CM_Clair); Print_dans_fenetre(120,55,"Image size :",CM_Fonce,CM_Clair); Print_dans_fenetre(120,63,"File size :",CM_Fonce,CM_Clair); - Print_dans_fenetre(120,73,"File name:",CM_Fonce,CM_Clair); + Print_dans_fenetre(120,72,"Format :",CM_Fonce,CM_Clair); Print_Format(); @@ -2441,15 +2446,15 @@ byte Bouton_Load_ou_Save(byte Load, byte Image) // On affiche une demande de confirmation if (Principal_File_list_Position+Principal_File_list_Decalage>=Liste_Nb_repertoires) { - Print_dans_fenetre(127,107,"Delete",CM_Fonce,CM_Clair); - Print_dans_fenetre(127,115,"file ?",CM_Fonce,CM_Clair); + Print_dans_fenetre(127,107+FILENAMESPACE,"Delete",CM_Fonce,CM_Clair); + Print_dans_fenetre(127,115+FILENAMESPACE,"file ?",CM_Fonce,CM_Clair); } else { - Print_dans_fenetre(127,107,"Remove",CM_Fonce,CM_Clair); - Print_dans_fenetre(127,115,"dir. ?",CM_Fonce,CM_Clair); + Print_dans_fenetre(127,107+FILENAMESPACE,"Remove",CM_Fonce,CM_Clair); + Print_dans_fenetre(127,115+FILENAMESPACE,"dir. ?",CM_Fonce,CM_Clair); } - Print_dans_fenetre(127,123,"Yes/No",CM_Fonce,CM_Clair); + Print_dans_fenetre(127,123+FILENAMESPACE,"Yes/No",CM_Fonce,CM_Clair); do { @@ -2457,7 +2462,7 @@ byte Bouton_Load_ou_Save(byte Load, byte Image) } while ((Etat_Du_Clavier[SDLK_y]==0) && (Etat_Du_Clavier[SDLK_n]==0) && (Etat_Du_Clavier[SDLK_ESCAPE]==0)); // On efface la demande de confirmation - Block(Fenetre_Pos_X+127*Menu_Facteur_X,Fenetre_Pos_Y+107*Menu_Facteur_Y, + Block(Fenetre_Pos_X+127*Menu_Facteur_X,Fenetre_Pos_Y+(107+FILENAMESPACE)*Menu_Facteur_Y, Menu_Facteur_X*48,Menu_Facteur_Y*24,CM_Clair); // Si l'utilisateur confirme, @@ -2581,13 +2586,13 @@ byte Bouton_Load_ou_Save(byte Load, byte Image) if ( (!Load) && (Format_Commentaire[Principal_Format-1]) ) { Effacer_curseur(); - Readline(46,176,Principal_Commentaire,32,0); + Readline(46,176+FILENAMESPACE,Principal_Commentaire,32,0); Afficher_curseur(); } break; case 8 : // Saisie du nom de fichier Effacer_curseur(); - if (Readline(202,73,Principal_Nom_fichier,12,2)) + if (Readline(13+9*8,90,Principal_Nom_fichier,27,2)) { // On regarde s'il faut rajouter une extension. C'est-à-dire s'il // n'y a pas de '.' dans le nom du fichier. @@ -2748,14 +2753,11 @@ byte Bouton_Load_ou_Save(byte Load, byte Image) if (Etat_chrono==2) { Effacer_curseur(); - // On efface le "but is:" - Block(Fenetre_Pos_X+27*Menu_Facteur_X,Fenetre_Pos_Y+74*Menu_Facteur_Y, - Menu_Facteur_X*80,Menu_Facteur_Y<<3,CM_Clair); // On efface le commentaire précédent - Block(Fenetre_Pos_X+ 46*Menu_Facteur_X,Fenetre_Pos_Y+176*Menu_Facteur_Y, + Block(Fenetre_Pos_X+ 46*Menu_Facteur_X,Fenetre_Pos_Y+(176+FILENAMESPACE)*Menu_Facteur_Y, Menu_Facteur_X<<8,Menu_Facteur_Y<<3,CM_Clair); // On néttoie la zone où va s'afficher la preview: - Block(Fenetre_Pos_X+180*Menu_Facteur_X,Fenetre_Pos_Y+ 89*Menu_Facteur_Y, + Block(Fenetre_Pos_X+180*Menu_Facteur_X,Fenetre_Pos_Y+ (89+FILENAMESPACE)*Menu_Facteur_Y, Menu_Facteur_X*122,Menu_Facteur_Y*82,CM_Clair); // On efface les dimensions de l'image Block(Fenetre_Pos_X+226*Menu_Facteur_X,Fenetre_Pos_Y+ 55*Menu_Facteur_Y, @@ -2763,12 +2765,15 @@ byte Bouton_Load_ou_Save(byte Load, byte Image) // On efface la taille du fichier Block(Fenetre_Pos_X+226*Menu_Facteur_X,Fenetre_Pos_Y+ 63*Menu_Facteur_Y, Menu_Facteur_X*72,Menu_Facteur_Y<<3,CM_Clair); + // On efface le format du fichier + Block(Fenetre_Pos_X+226*Menu_Facteur_X,Fenetre_Pos_Y+ 72*Menu_Facteur_Y, + Menu_Facteur_X*72,Menu_Facteur_Y<<3,CM_Clair); // Affichage du commentaire if ( (!Load) && (Format_Commentaire[Principal_Format-1]) ) - Print_dans_fenetre(46,176,Principal_Commentaire,CM_Noir,CM_Clair); + Print_dans_fenetre(46,176+FILENAMESPACE,Principal_Commentaire,CM_Noir,CM_Clair); Afficher_curseur(); - SDL_UpdateRect(Ecran_SDL,Fenetre_Pos_X+27*Menu_Facteur_X,Fenetre_Pos_Y+55*Menu_Facteur_Y,Menu_Facteur_X<<9,Menu_Facteur_Y<<4); + SDL_UpdateRect(Ecran_SDL,Fenetre_Pos_X+27*Menu_Facteur_X,Fenetre_Pos_Y+(55+FILENAMESPACE)*Menu_Facteur_Y,Menu_Facteur_X<<9,Menu_Facteur_Y<<4); } Nouvelle_preview=0; @@ -2788,7 +2793,7 @@ byte Bouton_Load_ou_Save(byte Load, byte Image) Effacer_curseur(); Charger_image(Image); - SDL_UpdateRect(Ecran_SDL,ToWinX(179),ToWinY(88),ToWinL(124),ToWinH(84)); + SDL_UpdateRect(Ecran_SDL,ToWinX(179),ToWinY(88+FILENAMESPACE),ToWinL(124),ToWinH(84)); Afficher_curseur(); // Après le chargement de la preview, on restaure tout ce qui aurait @@ -2947,8 +2952,8 @@ void Load_picture(byte Image) // Image=0 => On charge/sauve une brosse { // Données initiales du fichier (au cas où on voudrait annuler) - char Repertoire_fichier_initial[256]; - char Nom_fichier_initial[13]; + char Repertoire_fichier_initial[TAILLE_CHEMIN_FICHIER]; + char Nom_fichier_initial[TAILLE_CHEMIN_FICHIER]; byte Format_fichier_initial; byte Ne_pas_restaurer; byte Utiliser_palette_brosse = 0; @@ -3240,8 +3245,8 @@ void Save_picture(byte Image) // Image=0 => On charge/sauve une brosse { // Données initiales du fichier (au cas où on voudrait annuler) - char Repertoire_fichier_initial[256]; - char Nom_fichier_initial[13]; + char Repertoire_fichier_initial[TAILLE_CHEMIN_FICHIER]; + char Nom_fichier_initial[TAILLE_CHEMIN_FICHIER]; byte Format_fichier_initial; byte Ne_pas_restaurer; byte Ancienne_forme_curseur; diff --git a/const.h b/const.h index 8ff3d5da..e6d9c0eb 100644 --- a/const.h +++ b/const.h @@ -45,7 +45,7 @@ #define NB_PAGES_UNDO_MAX 99 // Nombre maximal de pages d'undo #define FACTEUR_DE_ZOOM_PAR_DEFAUT 4 // Facteur de zoom initial #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 +#define TAILLE_CHEMIN_FICHIER 260 // 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 // minimum de 256 Ko pour que le reste du programme puisse continuer à diff --git a/files.c b/files.c index c8711554..8086ef83 100644 --- a/files.c +++ b/files.c @@ -6,7 +6,7 @@ #include #include #include - +#include #include #include #include @@ -35,6 +35,7 @@ #define COULEUR_REPERTOIRE_SELECT CM_Clair // Couleur du texte pour une ligne de repértoire sélectionnée #define COULEUR_FOND_SELECT CM_Fonce // Couleur du fond pour une ligne sélectionnée +#define FILENAMESPACE 16 int Determiner_repertoire_courant(void) // Modifie Principal_Repertoire_courant en y mettant sa nouvelle valeur (avec le nom du @@ -72,8 +73,8 @@ int Repertoire_existe(char * Repertoire) int Fichier_existe(char * Fichier) -// D‚termine si un fichier pass‚ en paramŠtre existe ou non dans le -// r‚pertoire courant. +// Détermine si un fichier passé en paramŠtre existe ou non dans le +// répertoire courant. { struct stat buf; int Resultat; @@ -90,13 +91,13 @@ int Fichier_existe(char * Fichier) // Conventions: // -// * Le fileselect modifie le r‚pertoire courant. Ceci permet de n'avoir -// qu'un findfirst dans le r‚pertoire courant … faire: +// * Le fileselect modifie le répertoire courant. Ceci permet de n'avoir +// qu'un findfirst dans le répertoire courant … faire: -// -- D‚struction de la liste chaŒn‚e --------------------------------------- +// -- Déstruction de la liste chaŒnée --------------------------------------- void Detruire_liste_du_fileselect(void) -// Cette proc‚dure d‚truit la chaine des fichiers. Elle doit ˆtre appel‚e +// Cette procédure détruit la chaine des fichiers. Elle doit être appelée // avant de rappeler la fonction Lire_liste_des_fichiers, ainsi qu'en fin de // programme. { @@ -105,17 +106,17 @@ void Detruire_liste_du_fileselect(void) while (Liste_du_fileselect!=NULL) { - // On m‚morise l'adresse du premier ‚l‚ment de la liste + // On mémorise l'adresse du premier élément de la liste Element_temporaire =Liste_du_fileselect; - // On fait avancer la tˆte de la liste + // On fait avancer la tête de la liste Liste_du_fileselect=Liste_du_fileselect->Suivant; - // Et on efface l'ancien premier ‚l‚ment de la liste + // Et on efface l'ancien premier élément de la liste free(Element_temporaire); } } -// -- Formatage graphique des noms de fichier / r‚pertoire ------------------ +// -- Formatage graphique des noms de fichier / répertoire ------------------ char * Nom_formate(char * Nom) { static char Resultat[13]; @@ -130,7 +131,7 @@ char * Nom_formate(char * Nom) else { strcpy(Resultat," . "); - // On commence par recopier la partie pr‚c‚dent le point: + // On commence par recopier la partie précédent le point: for (Curseur=0;( (Nom[Curseur]!='.') && (Nom[Curseur]!='\0') );Curseur++) { if (Curseur < 8) @@ -141,7 +142,7 @@ char * Nom_formate(char * Nom) if (Nom[Curseur]=='.') Pos_DernierPoint = Curseur; - // Ensuite on recopie la partie qui suit le point (si n‚cessaire): + // Ensuite on recopie la partie qui suit le point (si nécessaire): if (Nom[Pos_DernierPoint]) { for (Curseur = Pos_DernierPoint+1,Autre_curseur=9;Nom[Curseur]!='\0' && Autre_curseur < 12;Curseur++,Autre_curseur++) @@ -154,7 +155,7 @@ char * Nom_formate(char * Nom) // -- Rajouter a la liste des elements de la liste un element --------------- void Ajouter_element_a_la_liste(struct dirent* Enreg) -// Cette procedure ajoute a la liste chainee un fichier pass‚ en argument. +// Cette procedure ajoute a la liste chainee un fichier passé en argument. { // Pointeur temporaire d'insertion struct Element_de_liste_de_fileselect * Element_temporaire; @@ -163,7 +164,8 @@ void Ajouter_element_a_la_liste(struct dirent* Enreg) Element_temporaire=(struct Element_de_liste_de_fileselect *)malloc(sizeof(struct Element_de_liste_de_fileselect)); // On met a jour le nouvel emplacement: - strcpy(Element_temporaire->Nom,Nom_formate(Enreg->d_name)); + strcpy(Element_temporaire->NomAbrege,Nom_formate(Enreg->d_name)); + strcpy(Element_temporaire->NomComplet,Enreg->d_name); #ifdef __linux__ Element_temporaire->Type = (Enreg->d_type == DT_DIR); #elif __WATCOMC__ @@ -182,6 +184,37 @@ void Ajouter_element_a_la_liste(struct dirent* Enreg) Liste_du_fileselect=Element_temporaire; } +// -- Vérification si un fichier a l'extension demandée. +// Autorise les '?', et '*' si c'est le seul caractère. +int VerifieExtension(const char *NomFichier, char * Filtre) +{ + int Pos_DernierPoint = -1; + int Curseur = 0; + + if (Filtre[0] == '*') + return 1; + // On recherche la position du dernier . dans le nom + for (Curseur = 0; NomFichier[Curseur]!='\0'; Curseur++) + if (NomFichier[Curseur]=='.') + Pos_DernierPoint = Curseur; + // Fichier sans extension (ca arrive) + if (Pos_DernierPoint == -1) + return (Filtre[0] == '\0'); + + // Vérification caractère par caractère, case-insensitive. + Curseur = 0; + do + { + if (Filtre[Curseur] != '?' && + tolower(Filtre[Curseur]) != tolower(NomFichier[Pos_DernierPoint + 1 + Curseur])) + return 0; + + Curseur++; + } while (Filtre[Curseur++] != '\0'); + + return 1; +} + // -- Lecture d'une liste de fichiers --------------------------------------- void Lire_liste_des_fichiers(byte Format_demande) @@ -190,15 +223,12 @@ void Lire_liste_des_fichiers(byte Format_demande) { DIR* Repertoire_Courant; //Répertoire courant struct dirent* Enreg; // Structure de lecture des éléments - char Filtre[6]="*."; // Place pour écrire "*.XXX" et un '\0' + char * Filtre = "*"; // Extension demandée struct stat Infos_enreg; // Tout d'abord, on déduit du format demandé un filtre à utiliser: if (Format_demande) // Format (extension) spécifique - strcat(Filtre,Format_Extension[Format_demande-1]); - else // *.* - strcat(Filtre,"*"); - + Filtre = Format_Extension[Format_demande-1]; // Ensuite, on vide la liste actuelle: Detruire_liste_du_fileselect(); @@ -218,19 +248,22 @@ void Lire_liste_des_fichiers(byte Format_demande) stat(Enreg->d_name,&Infos_enreg); // et que l'élément trouvé est un répertoire if( S_ISDIR(Infos_enreg.st_mode) && - // et qu'il n'est pas caché - ((!isHidden(Enreg)) || !Config.Lire_les_repertoires_caches)) + // et qu'il n'est pas caché + ((!isHidden(Enreg)) || !Config.Lire_les_repertoires_caches)) { - // On rajoute le répertore à la liste - Ajouter_element_a_la_liste(Enreg); - Liste_Nb_repertoires++; + // On rajoute le répertore à la liste + Ajouter_element_a_la_liste(Enreg); + Liste_Nb_repertoires++; } else if (S_ISREG(Infos_enreg.st_mode) //Il s'agit d'un fichier - && ((!isHidden(Enreg)) || !Config.Lire_les_fichiers_caches)) //Il n'est pas caché + && ((!isHidden(Enreg)) || !Config.Lire_les_fichiers_caches)) //Il n'est pas caché { - // On rajoute le fichier à la liste - Ajouter_element_a_la_liste(Enreg); - Liste_Nb_fichiers++; + if (VerifieExtension(Enreg->d_name, Filtre)) + { + // On rajoute le fichier à la liste + Ajouter_element_a_la_liste(Enreg); + Liste_Nb_fichiers++; + } } } @@ -244,27 +277,27 @@ void Lire_liste_des_fichiers(byte Format_demande) } -// -- Tri de la liste des fichiers et r‚pertoires --------------------------- +// -- Tri de la liste des fichiers et répertoires --------------------------- void Trier_la_liste_des_fichiers(void) -// Tri la liste chain‚e existante dans l'ordre suivant: +// Tri la liste chainée existante dans l'ordre suivant: // -// * Les r‚pertoires d'abord, dans l'ordre alphab‚tique de leur nom -// * Les fichiers ensuite, dans l'ordre alphab‚tique de leur nom +// * Les répertoires d'abord, dans l'ordre alphabétique de leur nom +// * Les fichiers ensuite, dans l'ordre alphabétique de leur nom { - byte La_liste_est_triee; // Bool‚en "La liste est tri‚e" - byte Inversion; // Bool‚en "Il faut inverser les ‚l‚ments" + byte La_liste_est_triee; // Booléen "La liste est triée" + byte Inversion; // Booléen "Il faut inverser les éléments" struct Element_de_liste_de_fileselect * Element_precedent; struct Element_de_liste_de_fileselect * Element_courant; struct Element_de_liste_de_fileselect * Element_suivant; struct Element_de_liste_de_fileselect * Element_suivant_le_suivant; - // Avant de trier quoi que ce soit, on v‚rifie qu'il y ait suffisamment - // d'‚l‚ments pour qu'il soit possibles qu'ils soient en d‚sordre: + // Avant de trier quoi que ce soit, on vérifie qu'il y ait suffisamment + // d'éléments pour qu'il soit possibles qu'ils soient en désordre: if (Liste_Nb_elements>1) { do { - // Par d‚faut, on considŠre que la liste est tri‚e + // Par défaut, on considŠre que la liste est triée La_liste_est_triee=1; Element_courant=Liste_du_fileselect; @@ -275,55 +308,55 @@ void Trier_la_liste_des_fichiers(void) // On commence par supposer qu'il n'y pas pas besoin d'inversion Inversion=0; - // Ensuite, on v‚rifie si les deux ‚l‚ments sont bien dans l'ordre ou + // Ensuite, on vérifie si les deux éléments sont bien dans l'ordre ou // non: - // Si l'‚l‚ment courant est un fichier est que le suivant est - // un r‚pertoire -> Inversion + // Si l'élément courant est un fichier est que le suivant est + // un répertoire -> Inversion if ( (Element_courant->Type==0) && (Element_suivant->Type==1) ) Inversion=1; - // Si les deux ‚l‚ments sont de mˆme type et que le nom du suivant + // Si les deux éléments sont de même type et que le nom du suivant // est plus petit que celui du courant -> Inversion else if ( (Element_courant->Type==Element_suivant->Type) && - (strcmp(Element_courant->Nom,Element_suivant->Nom)>0) ) + (strcmp(Element_courant->NomComplet,Element_suivant->NomComplet)>0) ) Inversion=1; if (Inversion) { - // Si les deux ‚l‚ments n‚cessitent d'ˆtre invers‚: + // Si les deux éléments nécessitent d'être inversé: // On les inverses: - // On note avant tout les ‚l‚ments qui encapsulent nos deux amis + // On note avant tout les éléments qui encapsulent nos deux amis Element_precedent =Element_courant->Precedent; Element_suivant_le_suivant=Element_suivant->Suivant; - // On permute le chaŒnage des deux ‚l‚ments entree eux + // On permute le chaŒnage des deux éléments entree eux Element_courant->Suivant =Element_suivant_le_suivant; Element_courant->Precedent=Element_suivant; Element_suivant->Suivant =Element_courant; Element_suivant->Precedent=Element_precedent; - // On tente un chaŒnage des ‚l‚ments encapsulant les compŠres: + // On tente un chaŒnage des éléments encapsulant les compŠres: if (Element_precedent!=NULL) Element_precedent->Suivant=Element_suivant; if (Element_suivant_le_suivant!=NULL) Element_suivant_le_suivant->Precedent=Element_courant; - // On fait bien attention … modifier la tˆte de liste en cas de besoin + // On fait bien attention … modifier la tête de liste en cas de besoin if (Element_courant==Liste_du_fileselect) Liste_du_fileselect=Element_suivant; - // Ensuite, on se pr‚pare … ‚tudier les ‚l‚ments pr‚c‚dents: + // Ensuite, on se prépare … étudier les éléments précédents: Element_courant=Element_precedent; - // Et on constate que la liste n'‚tait pas encore g‚nialement tri‚e + // Et on constate que la liste n'était pas encore génialement triée La_liste_est_triee=0; } else { - // Si les deux ‚l‚ments sont dans l'ordre: + // Si les deux éléments sont dans l'ordre: // On passe aux suivants Element_courant=Element_courant->Suivant; @@ -336,14 +369,14 @@ void Trier_la_liste_des_fichiers(void) } -// -- Affichage des ‚l‚ments de la liste de fichier / r‚pertoire ------------ +// -- Affichage des éléments de la liste de fichier / répertoire ------------ void Afficher_la_liste_des_fichiers(short Decalage_premier,short Decalage_select) // -// Decalage_premier = D‚calage entre le premier fichier visible dans le -// s‚lecteur et le premier fichier de la liste +// Decalage_premier = Décalage entre le premier fichier visible dans le +// sélecteur et le premier fichier de la liste // -// Decalage_select = D‚calage entre le premier fichier visible dans le -// s‚lecteur et le fichier s‚lectionn‚ dans la liste +// Decalage_select = Décalage entre le premier fichier visible dans le +// sélecteur et le fichier sélectionné dans la liste // { struct Element_de_liste_de_fileselect * Element_courant; @@ -352,7 +385,7 @@ void Afficher_la_liste_des_fichiers(short Decalage_premier,short Decalage_select byte Couleur_fond; - // On v‚rifie s'il y a au moins 1 fichier dans la liste: + // On vérifie s'il y a au moins 1 fichier dans la liste: if (Liste_Nb_elements>0) { // On commence par chercher … pointer sur le premier fichier visible: @@ -360,10 +393,10 @@ void Afficher_la_liste_des_fichiers(short Decalage_premier,short Decalage_select for (;Decalage_premier>0;Decalage_premier--) Element_courant=Element_courant->Suivant; - // Pour chacun des 10 ‚l‚ments inscriptibles … l'‚cran + // Pour chacun des 10 éléments inscriptibles … l'écran for (Indice=0;Indice<10;Indice++) { - // S'il est s‚lectionn‚: + // S'il est sélectionné: if (!Decalage_select) { // Si c'est un fichier @@ -385,8 +418,8 @@ void Afficher_la_liste_des_fichiers(short Decalage_premier,short Decalage_select Couleur_fond=COULEUR_FOND_NORMAL; } - // On affiche l'‚l‚ment - Print_dans_fenetre(9,90+(Indice<<3),Element_courant->Nom,Couleur_texte,Couleur_fond); + // On affiche l'élément + Print_dans_fenetre(9,90+FILENAMESPACE+(Indice<<3),Element_courant->NomAbrege,Couleur_texte,Couleur_fond); // On passe … la ligne suivante Decalage_select--; @@ -399,65 +432,62 @@ void Afficher_la_liste_des_fichiers(short Decalage_premier,short Decalage_select } -// -- R‚cup‚rer le libell‚ d'un ‚l‚ment de la liste ------------------------- +// -- Récupérer le libellé d'un élément de la liste ------------------------- void Determiner_element_de_la_liste(short Decalage_premier,short Decalage_select,char * Libelle) // -// Decalage_premier = D‚calage entre le premier fichier visible dans le -// s‚lecteur et le premier fichier de la liste +// Decalage_premier = Décalage entre le premier fichier visible dans le +// sélecteur et le premier fichier de la liste // -// Decalage_select = D‚calage entre le premier fichier visible dans le -// s‚lecteur et le fichier … r‚cup‚rer +// Decalage_select = Décalage entre le premier fichier visible dans le +// sélecteur et le fichier … récupérer // -// Libelle = Chaine de r‚ception du libell‚ de l'‚l‚ment +// Libelle = Chaine de réception du libellé de l'élément // { struct Element_de_liste_de_fileselect * Element_courant; char * Curseur; - // On v‚rifie s'il y a au moins 1 fichier dans la liste: + // On vérifie s'il y a au moins 1 fichier dans la liste: if (Liste_Nb_elements>0) { - // On commence par chercher … pointer sur le premier fichier visible: + // On commence par chercher à pointer sur le premier fichier visible: Element_courant=Liste_du_fileselect; for (;Decalage_premier>0;Decalage_premier--) Element_courant=Element_courant->Suivant; - // Ensuite, on saute autant d'‚l‚ments que le d‚calage demand‚: + // Ensuite, on saute autant d'éléments que le décalage demandé: for (;Decalage_select>0;Decalage_select--) Element_courant=Element_courant->Suivant; - // On recopie la chaŒne en la d‚formatant (i.e. tous les chars sauf ' ') - for (Curseur=Element_courant->Nom;*Curseur!='\0';Curseur++) - if (*Curseur!=' ') - *(Libelle++)=*Curseur; - *Libelle='\0'; + // On recopie la chaîne + strcpy(Libelle, Element_courant->NomComplet); } // Fin du test d'existence de fichiers } -// ----------------- D‚placements dans la liste de fichiers ----------------- +// ----------------- Déplacements dans la liste de fichiers ----------------- void Select_Scroll_Down(short * Decalage_premier,short * Decalage_select) -// Fait scroller vers le bas le s‚lecteur de fichier... (si possible) +// Fait scroller vers le bas le sélecteur de fichier... (si possible) { if ( ((*Decalage_select)<9) && ( (*Decalage_select)+1 < Liste_Nb_elements ) ) - // Si la s‚lection peut descendre + // Si la sélection peut descendre Afficher_la_liste_des_fichiers(*Decalage_premier,++(*Decalage_select)); - else // Sinon, descendre la fenˆtre (si possible) + else // Sinon, descendre la fenêtre (si possible) if ((*Decalage_premier)+100) - // Si la s‚lection peut monter + // Si la sélection peut monter Afficher_la_liste_des_fichiers(*Decalage_premier,--(*Decalage_select)); - else // Sinon, monter la fenˆtre (si possible) + else // Sinon, monter la fenêtre (si possible) if ((*Decalage_premier)>0) Afficher_la_liste_des_fichiers(--(*Decalage_premier),*Decalage_select); } @@ -534,14 +564,14 @@ void Select_Home(short * Decalage_premier,short * Decalage_select) short Calculer_decalage_click_dans_fileselector(void) /* - Renvoie le d‚calage dans le s‚lecteur de fichier sur lequel on a click‚. - Renvoie le d‚calage du dernier fichier si on a click‚ au del…. - Renvoie -1 si le s‚lecteur est vide. + Renvoie le décalage dans le sélecteur de fichier sur lequel on a clické. + Renvoie le décalage du dernier fichier si on a clické au del…. + Renvoie -1 si le sélecteur est vide. */ { short Decalage_calcule; - Decalage_calcule=(((Mouse_Y-Fenetre_Pos_Y)/Menu_Facteur_Y)-90)>>3; + Decalage_calcule=(((Mouse_Y-Fenetre_Pos_Y)/Menu_Facteur_Y)-(90+FILENAMESPACE))>>3; if (Decalage_calcule>=Liste_Nb_elements) Decalage_calcule=Liste_Nb_elements-1; diff --git a/global.h b/global.h index 9cc0b400..99b6c487 100644 --- a/global.h +++ b/global.h @@ -242,13 +242,13 @@ GLOBAL short Brouillon_Decalage_Y; // D GLOBAL short Ancien_Brouillon_Decalage_X; GLOBAL short Ancien_Brouillon_Decalage_Y; -GLOBAL char Brouillon_Repertoire_fichier[256]; // |_ Nom complet = -GLOBAL char Brouillon_Nom_fichier[13]; // | Repertoire_fichier+"\"+Nom_fichier +GLOBAL char Brouillon_Repertoire_fichier[TAILLE_CHEMIN_FICHIER]; // |_ Nom complet = +GLOBAL char Brouillon_Nom_fichier[TAILLE_CHEMIN_FICHIER]; // | Repertoire_fichier+"\"+Nom_fichier GLOBAL byte Brouillon_Format_fichier; // Format auquel il faut lire et Úcrire le fichier GLOBAL byte Brouillon_Format; // Format du fileselect GLOBAL short Brouillon_File_list_Position; // DÚbut de la partie affichÚe dans la liste de fichiers GLOBAL short Brouillon_File_list_Decalage; // DÚcalage de la barre de sÚlection dans le fileselector -GLOBAL char Brouillon_Repertoire_courant[256]; // RÚpertoire actuel sur disque +GLOBAL char Brouillon_Repertoire_courant[TAILLE_CHEMIN_FICHIER]; // RÚpertoire actuel sur disque GLOBAL char Brouillon_Commentaire[TAILLE_COMMENTAIRE+1]; // Commentaire de l'image GLOBAL short Brouillon_Split; // Position en X du bord gauche du split de la loupe @@ -279,14 +279,14 @@ GLOBAL word Brosse_Decalage_Y; // Centre vertical de la brosse GLOBAL word Brosse_Largeur; // Largeur de la brosse GLOBAL word Brosse_Hauteur; // Hauteur de la brosse -GLOBAL char Brosse_Repertoire_fichier[256]; // | -GLOBAL char Brosse_Nom_fichier[13]; // | -GLOBAL byte Brosse_Format_fichier; // | Infos sur le -GLOBAL byte Brosse_Format; // |_ sÚlecteur de -GLOBAL short Brosse_File_list_Position; // | fichiers de la -GLOBAL short Brosse_File_list_Decalage; // | brosse. -GLOBAL char Brosse_Repertoire_courant[256]; // | -GLOBAL char Brosse_Commentaire[TAILLE_COMMENTAIRE+1]; // | +GLOBAL char Brosse_Repertoire_fichier[TAILLE_CHEMIN_FICHIER];// | +GLOBAL char Brosse_Nom_fichier[TAILLE_CHEMIN_FICHIER]; // | +GLOBAL byte Brosse_Format_fichier; // | Infos sur le +GLOBAL byte Brosse_Format; // |_ sÚlecteur de +GLOBAL short Brosse_File_list_Position; // | fichiers de la +GLOBAL short Brosse_File_list_Decalage; // | brosse. +GLOBAL char Brosse_Repertoire_courant[256]; // | +GLOBAL char Brosse_Commentaire[TAILLE_COMMENTAIRE+1]; // | GLOBAL byte Brosse_Centre_rotation_defini; // | Infos sur le GLOBAL short Brosse_Centre_rotation_X; // |- centre de rotation diff --git a/loadsave.c b/loadsave.c index 9e188ba0..ab4267e8 100644 --- a/loadsave.c +++ b/loadsave.c @@ -32,6 +32,8 @@ #define PERMISSIONS_ECRITURE (S_IRUSR|S_IWUSR) #endif +#define FILENAMESPACE 16 + // Conversion des words d'une structure, si necessaire sur cette plate-forme void Retraite_Word_LittleEndian(word ** Adresse) { @@ -254,16 +256,15 @@ void Initialiser_preview(short Largeur,short Hauteur,long Taille,int Format) // Affichage du vrai format if (Format!=Principal_Format) { - Print_dans_fenetre( 27,74,"but is:",CM_Fonce,CM_Clair); - Print_dans_fenetre( 83,74,Format_Extension[Format-1],CM_Noir,CM_Clair); + Print_dans_fenetre( 274,72,Format_Extension[Format-1],CM_Noir,CM_Clair); } // On efface le commentaire précédent - Block(Fenetre_Pos_X+46*Menu_Facteur_X,Fenetre_Pos_Y+176*Menu_Facteur_Y, + Block(Fenetre_Pos_X+46*Menu_Facteur_X,Fenetre_Pos_Y+(176+FILENAMESPACE)*Menu_Facteur_Y, Menu_Facteur_X<<8,Menu_Facteur_Y<<3,CM_Clair); // Affichage du commentaire if (Format_Commentaire[Format-1]) - Print_dans_fenetre(46,176,Principal_Commentaire,CM_Noir,CM_Clair); + Print_dans_fenetre(46,176+FILENAMESPACE,Principal_Commentaire,CM_Noir,CM_Clair); // Calculs des données nécessaires à l'affichage de la preview: Preview_Facteur_X=Round_div_max(Largeur,122*Menu_Facteur_X); @@ -278,7 +279,7 @@ void Initialiser_preview(short Largeur,short Hauteur,long Taille,int Format) } Preview_Pos_X=Fenetre_Pos_X+180*Menu_Facteur_X; - Preview_Pos_Y=Fenetre_Pos_Y+ 89*Menu_Facteur_Y; + Preview_Pos_Y=Fenetre_Pos_Y+ (89+FILENAMESPACE)*Menu_Facteur_Y; // On nettoie la zone o— va s'afficher la preview: Block(Preview_Pos_X,Preview_Pos_Y, @@ -335,7 +336,7 @@ void Dessiner_preview_palette(void) { short Indice; short Preview_Pos_X=Fenetre_Pos_X+186*Menu_Facteur_X; - short Preview_Pos_Y=Fenetre_Pos_Y+ 90*Menu_Facteur_Y; + short Preview_Pos_Y=Fenetre_Pos_Y+ (90+FILENAMESPACE)*Menu_Facteur_Y; if (Pixel_de_chargement==Pixel_Chargement_dans_preview) for (Indice=0; Indice<256; Indice++) @@ -745,21 +746,21 @@ void Save_PAL(void) //////////////////////////////////// IMG //////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// - +typedef struct +{ + byte Filler1[6]; + word Largeur; + word Hauteur; + byte Filler2[118]; + T_Palette Palette; +} T_Header_IMG; // -- Tester si un fichier est au format IMG -------------------------------- void Test_IMG(void) { int Handle; // Handle du fichier char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier - struct Header - { - byte Filler1[6]; - word Largeur; - word Hauteur; - byte Filler2[118]; - T_Palette Palette; - } IMG_Header; + T_Header_IMG IMG_Header; byte Signature[6]={0x01,0x00,0x47,0x12,0x6D,0xB0}; @@ -772,7 +773,7 @@ void Test_IMG(void) if (Handle!=-1) { // Lecture et vérification de la signature - if ((read(Handle,&IMG_Header,sizeof(struct Header)))==sizeof(struct Header)) + if ((read(Handle,&IMG_Header,sizeof(T_Header_IMG)))==sizeof(T_Header_IMG)) { if ( (!memcmp(IMG_Header.Filler1,Signature,6)) && IMG_Header.Largeur && IMG_Header.Hauteur) @@ -793,14 +794,7 @@ void Load_IMG(void) word Pos_X,Pos_Y; long Largeur_lue; long Taille_du_fichier; - struct Header - { - byte Filler1[6]; - word Largeur; - word Hauteur; - byte Filler2[118]; - T_Palette Palette; - } IMG_Header; + T_Header_IMG IMG_Header; struct stat* Informations_Fichier=NULL; @@ -813,7 +807,7 @@ void Load_IMG(void) stat(Nom_du_fichier,Informations_Fichier); Taille_du_fichier=Informations_Fichier->st_size; - if (read(Fichier,&IMG_Header,sizeof(struct Header))==sizeof(struct Header)) + if (read(Fichier,&IMG_Header,sizeof(T_Header_IMG))==sizeof(T_Header_IMG)) { Buffer=(byte *)malloc(IMG_Header.Largeur); @@ -860,14 +854,7 @@ void Save_IMG(void) char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier int Fichier; short Pos_X,Pos_Y; - struct Header - { - byte Filler1[6]; // Signature (??!) - word Largeur; - word Hauteur; - byte Filler2[118]; - T_Palette Palette; - } IMG_Header; + T_Header_IMG IMG_Header; byte Signature[6]={0x01,0x00,0x47,0x12,0x6D,0xB0}; Nom_fichier_complet(Nom_du_fichier,0); @@ -893,7 +880,7 @@ void Save_IMG(void) memcpy(IMG_Header.Palette,Principal_Palette,sizeof(T_Palette)); Palette_256_to_64(Principal_Palette); - if (write(Fichier,&IMG_Header,sizeof(struct Header))!=-1) + if (write(Fichier,&IMG_Header,sizeof(T_Header_IMG))!=-1) { Init_ecriture(); @@ -928,27 +915,27 @@ void Save_IMG(void) //////////////////////////////////// PKM //////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// - +typedef struct +{ + char Ident[3]; // Chaîne "PKM" } + byte Methode; // Méthode de compression: + // 0 = compression en ligne (c)KM + // autres = inconnues pour le moment + byte Recon1; // Octet de reconnaissance sur 1 octet } + byte Recon2; // Octet de reconnaissance sur 2 octets } + word Largeur; // Largeur de l'image + word Hauteur; // Hauteur de l'image + T_Palette Palette; // Palette RVB 256*3 + word Jump; // Taille du saut entre le header et l'image: + // On va s'en servir pour rajouter un commentaire +} T_Header_PKM; // -- Tester si un fichier est au format PKM -------------------------------- void Test_PKM(void) { int Fichier; // Handle du fichier char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier - struct Header - { - char Ident[3]; // ChaŒne "PKM" } - byte Methode; // Méthode de compression: - // 0 = compression en ligne (c)KM - // autres = inconnues pour le moment - byte Recon1; // Octet de reconnaissance sur 1 octet } - byte Recon2; // Octet de reconnaissance sur 2 octets } - word Largeur; // Largeur de l'image - word Hauteur; // Hauteur de l'image - T_Palette Palette; // Palette RVB 256*3 - word Jump; // Taille du saut entre le header et l'image: - // On va s'en servir pour rajouter un commentaire - } Head; + T_Header_PKM Head; Nom_fichier_complet(Nom_du_fichier,0); @@ -960,7 +947,7 @@ void Test_PKM(void) if (Fichier!=-1) { // Lecture du header du fichier - if (read(Fichier,&Head,sizeof(struct Header))==sizeof(struct Header)) + if (read(Fichier,&Head,sizeof(T_Header_PKM))==sizeof(T_Header_PKM)) { // On regarde s'il y a la signature PKM suivie de la méthode 0. // La constante "PKM" étant un chaŒne, elle se termine toujours par 0. @@ -978,20 +965,7 @@ void Load_PKM(void) { int Fichier; // Handle du fichier char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier - struct Header - { - char Ident[3]; // ChaŒne "PKM" } - byte Methode; // Méthode de compression: - // 0 = compression en ligne (c)KM - // autres = inconnues pour le moment - byte Recon1; // Octet de reconnaissance sur 1 octet } - byte Recon2; // Octet de reconnaissance sur 2 octets } - word Largeur; // Largeur de l'image - word Hauteur; // Hauteur de l'image - T_Palette Palette; // Palette RVB 256*3 - word Jump; // Taille du saut entre le header et l'image: - // On va s'en servir pour rajouter un commentaire - } Head; + T_Header_PKM Head; byte Couleur; byte Octet; word Mot; @@ -1013,7 +987,7 @@ void Load_PKM(void) stat(Nom_du_fichier,&Informations_Fichier); Taille_du_fichier=Informations_Fichier.st_size; - if (read(Fichier,&Head,sizeof(struct Header))==sizeof(struct Header)) + if (read(Fichier,&Head,sizeof(T_Header_PKM))==sizeof(T_Header_PKM)) { Principal_Commentaire[0]='\0'; // On efface le commentaire if (Head.Jump) @@ -1121,7 +1095,7 @@ void Load_PKM(void) Compteur_de_donnees_packees=0; Compteur_de_pixels=0; - Taille_pack=(Informations_Fichier.st_size)-sizeof(struct Header)-Head.Jump; + Taille_pack=(Informations_Fichier.st_size)-sizeof(T_Header_PKM)-Head.Jump; // Boucle de décompression: while ( (Compteur_de_pixels il faut copier les 32 coul. } // sur les 32 suivantes et assombrir ces derniŠres. else { - if ((Header.Bit_planes==6) || (Header.Bit_planes==8)) - Image_HAM=Header.Bit_planes; + if ((Header.BitPlanes==6) || (Header.BitPlanes==8)) + Image_HAM=Header.BitPlanes; else // Erreur_fichier=1; /* C'est censé ˆtre incorrect mais j'ai */ Image_HAM=0; /* trouvé un fichier comme ‡a, alors... */ @@ -1739,9 +1700,9 @@ void Load_LBM(void) if ( (!Erreur_fichier) && (Nb_couleurs>=2) && (Nb_couleurs<=256) ) { - HBPm1=Header.Bit_planes-1; + HBPm1=Header.BitPlanes-1; if (Header.Mask==1) - Header.Bit_planes++; + Header.BitPlanes++; // Deluxe paint le fait... alors on le fait... Back_color=Header.Transp_col; @@ -1785,12 +1746,12 @@ void Load_LBM(void) if (Principal_Largeur_image & 15) { Vraie_taille_ligne=( (Principal_Largeur_image+16) >> 4 ) << 4; - Taille_ligne=( (Principal_Largeur_image+16) >> 4 )*(Header.Bit_planes<<1); + Taille_ligne=( (Principal_Largeur_image+16) >> 4 )*(Header.BitPlanes<<1); } else { Vraie_taille_ligne=Principal_Largeur_image; - Taille_ligne=(Principal_Largeur_image>>3)*Header.Bit_planes; + Taille_ligne=(Principal_Largeur_image>>3)*Header.BitPlanes; } if (!Header.Compression) @@ -2019,22 +1980,7 @@ void Load_LBM(void) void Save_LBM(void) { char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; - struct Header_LBM - { - word Width; - word Height; - short Xorg; // Inutile - short Yorg; // Inutile - byte BitPlanes; - byte Mask; - byte Compression; - byte Pad1; // Inutile - word Transp_col; // Inutile - byte Xaspect; // Inutile - byte Yaspect; // Inutile - short Xscreen; - short Yscreen; - } Header; + T_Header_LBM Header; word Pos_X; word Pos_Y; byte Octet; @@ -2073,7 +2019,7 @@ void Save_LBM(void) swab((byte *)&Largeur_ecran,(byte *)&Header.Xscreen,2); swab((byte *)&Hauteur_ecran,(byte *)&Header.Yscreen,2); - write(LBM_Fichier,&Header,sizeof(struct Header_LBM)); + write(LBM_Fichier,&Header,sizeof(T_Header_LBM)); write(LBM_Fichier,"CMAP",4); Ecrire_long(sizeof(T_Palette)); @@ -2153,7 +2099,7 @@ void Save_LBM(void) ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// -struct BMP_Header +typedef struct { word Signature; // ='BM' = 0x4D42 uint32_t Taille_1; // =Taille du fichier @@ -2172,14 +2118,14 @@ struct BMP_Header uint32_t YPM; uint32_t Nb_Clr; uint32_t Clr_Imprt; -}; +} T_BMP_Header; // -- Tester si un fichier est au format BMP -------------------------------- void Test_BMP(void) { char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; int Fichier; - struct BMP_Header Header; + T_BMP_Header Header; Erreur_fichier=1; Nom_fichier_complet(Nom_du_fichier,0); @@ -2219,7 +2165,7 @@ void Load_BMP(void) { char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; int Fichier; - struct BMP_Header Header; + T_BMP_Header Header; byte * Buffer; word Indice; byte Palette_locale[256][4]; // R,V,B,0 @@ -2493,26 +2439,7 @@ void Save_BMP(void) { char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; int Fichier; - struct BMP_Header - { - word Signature; // ='BM' = 0x4D42 - long Taille_1; // =Taille du fichier - word Reserv_1; // =0 - word Reserv_2; // =0 - long Decalage; // Nb octets avant les données bitmap - - long Taille_2; // =40 - long Largeur; - long Hauteur; - word Plans; // =1 - word Nb_bits; // =1,4,8 ou 24 - long Compression; - long Taille_3; - long XPM; - long YPM; - long Nb_Clr; - long Clr_Imprt; - } Header; + T_BMP_Header Header; short Pos_X; short Pos_Y; long Taille_ligne; @@ -2549,7 +2476,7 @@ void Save_BMP(void) Header.Nb_Clr =0; Header.Clr_Imprt =0; - if (write(Fichier,&Header,sizeof(struct BMP_Header))!=-1) + if (write(Fichier,&Header,sizeof(T_BMP_Header))!=-1) { // Chez Bill, ils ont dit: "On va mettre les couleur dans l'ordre // inverse, et pour faire chier, on va les mettre sur une échelle de @@ -2613,7 +2540,24 @@ void Save_BMP(void) //////////////////////////////////// GIF //////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// +typedef struct +{ + word Largeur; // Largeur de l'écran virtuel + word Hauteur; // Hauteur de l'écran virtuel + byte Resol; // Informations sur la résolution (et autres) + byte Backcol; // Couleur de fond + byte Aspect; // Informations sur l'aspect ratio (et autres) +} T_LSDB; // Logical Screen Descriptor Block +typedef struct +{ + word Pos_X; // Abscisse où devrait être affichée l'image + word Pos_Y; // Ordonnée où devrait être affichée l'image + word Largeur_image; // Largeur de l'image + word Hauteur_image; // Hauteur de l'image + byte Indicateur; // Informations diverses sur l'image + byte Nb_bits_pixel; // Nb de bits par pixel +} T_IDB; // Image Descriptor Block // -- Tester si un fichier est au format GIF -------------------------------- @@ -2749,24 +2693,8 @@ void Load_GIF(void) word Alphabet_Max; // Nombre d'entrées possibles dans l'alphabet word Alphabet_Pos_pile; // Position dans la pile de décodage d'un chaîne - struct Type_LSDB - { - word Largeur; // Largeur de l'écran virtuel - word Hauteur; // Hauteur de l'écran virtuel - byte Resol; // Informations sur la résolution (et autres) - byte Backcol; // Couleur de fond - byte Aspect; // Informations sur l'aspect ratio (et autres) - } LSDB; // Logical Screen Descriptor Block - - struct Type_IDB - { - word Pos_X; // Abscisse où devrait être affichée l'image - word Pos_Y; // Ordonnée où devrait être affichée l'image - word Largeur_image; // Largeur de l'image - word Hauteur_image; // Hauteur de l'image - byte Indicateur; // Informations diverses sur l'image - byte Nb_bits_pixel; // Nb de bits par pixel - } IDB; // Image Descriptor Block + T_LSDB LSDB; + T_IDB IDB; word Nb_couleurs; // Nombre de couleurs dans l'image word Indice_de_couleur; // Indice de traitement d'une couleur @@ -3147,24 +3075,9 @@ void Save_GIF(void) word Depart; // Code précédent (sert au linkage des chaŒnes) int Descente; // Booléen "On vient de descendre" - struct Type_LSDB - { - word Largeur; // Largeur de l'écran virtuel |_ Dimensions de l'image si 1 - word Hauteur; // Hauteur de l'écran virtuel | seule image dans le fichier (ce qui est notre cas) - byte Resol; // Informations sur la résolution (et autres) - byte Backcol; // Couleur de fond - byte Aspect; // Informations sur l'aspect ratio (et autres) - } LSDB; // Logical Screen Descriptor Block + T_LSDB LSDB; + T_IDB IDB; - struct Type_IDB - { - word Pos_X; // Abscisse o— devrait ˆtre affichée l'image - word Pos_Y; // Ordonnée o— devrait ˆtre affichée l'image - word Largeur_image; // Largeur de l'image - word Hauteur_image; // Hauteur de l'image - byte Indicateur; // Informations diverses sur l'image - byte Nb_bits_pixel; // Nb de bits par pixel - } IDB; // Image Descriptor Block byte Block_indicateur; // Code indicateur du type de bloc en cours word Chaine_en_cours; // Code de la chaŒne en cours de traitement @@ -3214,7 +3127,7 @@ void Save_GIF(void) // On sauve le LSDB dans le fichier - if (write(GIF_Fichier,&LSDB,sizeof(struct Type_LSDB))==sizeof(struct Type_LSDB)) + if (write(GIF_Fichier,&LSDB,sizeof(T_LSDB))==sizeof(T_LSDB)) { // Le LSDB a été correctement écrit. @@ -3239,7 +3152,7 @@ void Save_GIF(void) IDB.Nb_bits_pixel=8; // Image 256 couleurs; if ( (write(GIF_Fichier,&Block_indicateur,1)==1) && - (write(GIF_Fichier,&IDB,sizeof(struct Type_IDB))==sizeof(struct Type_IDB)) ) + (write(GIF_Fichier,&IDB,sizeof(T_IDB))==sizeof(T_IDB)) ) { // Le block indicateur d'IDB et l'IDB ont étés correctements // écrits. @@ -3941,7 +3854,24 @@ void Save_PCX(void) //////////////////////////////////// CEL //////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// +typedef struct +{ + word Width; // Largeur de l'image + word Height; // Hauteur de l'image +} T_CEL_Header1; +typedef struct +{ + byte Signa[4]; // Signature du format + byte Kind; // Type de fichier ($10=PALette $20=BitMaP) + byte Nbbits; // Nombre de bits + word Filler1; // ??? + word Largeur; // Largeur de l'image + word Hauteur; // Hauteur de l'image + word Decalage_X; // Decalage en X de l'image + word Decalage_Y; // Decalage en Y de l'image + byte Filler2[16]; // ??? +} T_CEL_Header2; // -- Tester si un fichier est au format CEL -------------------------------- @@ -3950,42 +3880,27 @@ void Test_CEL(void) char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; int Taille; int Fichier; - struct CEL_Header1 - { - word Width; // Largeur de l'image - word Height; // Hauteur de l'image - } Header1; - struct CEL_Header2 - { - byte Signa[4]; // Signature du format - byte Kind; // Type de fichier ($10=PALette $20=BitMaP) - byte Nbbits; // Nombre de bits - word Filler1; // ??? - word Largeur; // Largeur de l'image - word Hauteur; // Hauteur de l'image - word Decalage_X; // Decalage en X de l'image - word Decalage_Y; // Decalage en Y de l'image - byte Filler2[16]; // ??? - } Header2; + T_CEL_Header1 Header1; + T_CEL_Header2 Header2; struct stat Informations_Fichier; Erreur_fichier=0; Nom_fichier_complet(Nom_du_fichier,0); if ((Fichier=open(Nom_du_fichier,O_RDONLY|O_BINARY))!=-1) { - if (read(Fichier,&Header1,sizeof(struct CEL_Header1))==sizeof(struct CEL_Header1)) + if (read(Fichier,&Header1,sizeof(T_CEL_Header1))==sizeof(T_CEL_Header1)) { // Vu que ce header n'a pas de signature, il va falloir tester la // cohérence de la dimension de l'image avec celle du fichier. if (!stat(Nom_du_fichier,&Informations_Fichier)) Erreur_fichier = 1; // Si on ne peut pas faire de stat il vaut mieux laisser tomber - Taille=(Informations_Fichier.st_size)-sizeof(struct CEL_Header1); + Taille=(Informations_Fichier.st_size)-sizeof(T_CEL_Header1); if ( (!Taille) || ( (((Header1.Width+1)>>1)*Header1.Height)!=Taille ) ) { // Tentative de reconnaissance de la signature des nouveaux fichiers lseek(Fichier,0,SEEK_SET); - if (read(Fichier,&Header2,sizeof(struct CEL_Header2))==sizeof(struct CEL_Header2)) + if (read(Fichier,&Header2,sizeof(T_CEL_Header2))==sizeof(T_CEL_Header2)) { if (memcmp(Header2.Signa,"KiSS",4)==0) { @@ -4015,23 +3930,8 @@ void Load_CEL(void) { char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; int Fichier; - struct CEL_Header1 - { - word Width; // Largeur de l'image - word Height; // Hauteur de l'image - } Header1; - struct CEL_Header2 - { - byte Signa[4]; // Signature du format - byte Kind; // Type de fichier ($10=PALette $20=BitMaP) - byte Nbbits; // Nombre de bits - word Filler1; // ??? - word Largeur; // Largeur de l'image - word Hauteur; // Hauteur de l'image - word Decalage_X; // Decalage en X de l'image - word Decalage_Y; // Decalage en Y de l'image - byte Filler2[16]; // ??? - } Header2; + T_CEL_Header1 Header1; + T_CEL_Header2 Header2; short Pos_X; short Pos_Y; byte Dernier_octet=0; @@ -4043,12 +3943,12 @@ void Load_CEL(void) Nom_fichier_complet(Nom_du_fichier,0); if ((Fichier=open(Nom_du_fichier,O_RDONLY|O_BINARY))!=-1) { - if (read(Fichier,&Header1,sizeof(struct CEL_Header1))==sizeof(struct CEL_Header1)) + if (read(Fichier,&Header1,sizeof(T_CEL_Header1))==sizeof(T_CEL_Header1)) { stat(Nom_du_fichier,Informations_Fichier); Taille_du_fichier=Informations_Fichier->st_size; - if ( (Taille_du_fichier>sizeof(struct CEL_Header1)) - && ( (((Header1.Width+1)>>1)*Header1.Height)==(Taille_du_fichier-sizeof(struct CEL_Header1)) ) ) + if ( (Taille_du_fichier>sizeof(T_CEL_Header1)) + && ( (((Header1.Width+1)>>1)*Header1.Height)==(Taille_du_fichier-sizeof(T_CEL_Header1)) ) ) { // Chargement d'un fichier CEL sans signature (vieux fichiers) Principal_Largeur_image=Header1.Width; @@ -4077,7 +3977,7 @@ void Load_CEL(void) // On réessaye avec le nouveau format lseek(Fichier,0,SEEK_SET); - if (read(Fichier,&Header2,sizeof(struct CEL_Header2))==sizeof(struct CEL_Header2)) + if (read(Fichier,&Header2,sizeof(T_CEL_Header2))==sizeof(T_CEL_Header2)) { // Chargement d'un fichier CEL avec signature (nouveaux fichiers) @@ -4147,23 +4047,8 @@ void Save_CEL(void) { char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; int Fichier; - struct CEL_Header1 - { - word Width; // Largeur de l'image - word Height; // Hauteur de l'image - } Header1; - struct CEL_Header2 - { - byte Signa[4]; // Signature du format - byte Kind; // Type de fichier ($10=PALette $20=BitMaP) - byte Nbbits; // Nombre de bits - word Filler1; // ??? - word Largeur; // Largeur de l'image - word Hauteur; // Hauteur de l'image - word Decalage_X; // Decalage en X de l'image - word Decalage_Y; // Decalage en Y de l'image - byte Filler2[16]; // ??? - } Header2; + T_CEL_Header1 Header1; + T_CEL_Header2 Header2; short Pos_X; short Pos_Y; byte Dernier_octet=0; @@ -4187,7 +4072,7 @@ void Save_CEL(void) Header1.Width =Principal_Largeur_image; Header1.Height=Principal_Hauteur_image; - if (write(Fichier,&Header1,sizeof(struct CEL_Header1))!=-1) + if (write(Fichier,&Header1,sizeof(T_CEL_Header1))!=-1) { // Sauvegarde de l'image Init_ecriture(); @@ -4244,7 +4129,7 @@ void Save_CEL(void) for (Pos_X=0;Pos_X<16;Pos_X++) // Initialisation du filler 2 (???) Header2.Filler2[Pos_X]=0; - if (write(Fichier,&Header2,sizeof(struct CEL_Header2))!=-1) + if (write(Fichier,&Header2,sizeof(T_CEL_Header2))!=-1) { // Sauvegarde de l'image Init_ecriture(); @@ -4271,7 +4156,17 @@ void Save_CEL(void) //////////////////////////////////// KCF //////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// - +typedef struct +{ + struct + { + struct + { + byte Octet1; + byte Octet2; + } Couleur[16]; + } Palette[10]; +} T_KCF_Header; // -- Tester si un fichier est au format KCF -------------------------------- @@ -4279,29 +4174,8 @@ void Test_KCF(void) { char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; int Fichier; - struct KCF_Header - { - struct - { - struct - { - byte Octet1; - byte Octet2; - } Couleur[16]; - } Palette[10]; - } Buffer; - struct CEL_Header2 - { - byte Signa[4]; // Signature du format - byte Kind; // Type de fichier ($10=PALette $20=BitMaP) - byte Nbbits; // Nombre de bits - word Filler1; // ??? - word Largeur; // Largeur de l'image - word Hauteur; // Hauteur de l'image - word Decalage_X; // Decalage en X de l'image - word Decalage_Y; // Decalage en Y de l'image - byte Filler2[16]; // ??? - } Header2; + T_KCF_Header Buffer; + T_CEL_Header2 Header2; int Indice_palette; int Indice_couleur; @@ -4309,9 +4183,9 @@ void Test_KCF(void) Nom_fichier_complet(Nom_du_fichier,0); if ((Fichier=open(Nom_du_fichier,O_RDONLY|O_BINARY))!=-1) { - if (filelength(Fichier)==sizeof(struct KCF_Header)) + if (filelength(Fichier)==sizeof(T_KCF_Header)) { - read(Fichier,&Buffer,sizeof(struct KCF_Header)); + read(Fichier,&Buffer,sizeof(T_KCF_Header)); // On vérifie une propriété de la structure de palette: for (Indice_palette=0;Indice_palette<10;Indice_palette++) for (Indice_couleur=0;Indice_couleur<16;Indice_couleur++) @@ -4320,7 +4194,7 @@ void Test_KCF(void) } else { - if (read(Fichier,&Header2,sizeof(struct CEL_Header2))==sizeof(struct CEL_Header2)) + if (read(Fichier,&Header2,sizeof(T_CEL_Header2))==sizeof(T_CEL_Header2)) { if (memcmp(Header2.Signa,"KiSS",4)==0) { @@ -4346,29 +4220,8 @@ void Load_KCF(void) { char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; int Fichier; - struct KCF_Header - { - struct - { - struct - { - byte Octet1; - byte Octet2; - } Couleur[16]; - } Palette[10]; - } Buffer; - struct CEL_Header2 - { - byte Signa[4]; // Signature du format - byte Kind; // Type de fichier ($10=PALette $20=BitMaP) - byte Nbbits; // Nombre de bits - word Filler1; // ??? - word Largeur; // Largeur de l'image ou nb de couleurs définies - word Hauteur; // Hauteur de l'image ou nb de palettes définies - word Decalage_X; // Decalage en X de l'image - word Decalage_Y; // Decalage en Y de l'image - byte Filler2[16]; // ??? - } Header2; + T_KCF_Header Buffer; + T_CEL_Header2 Header2; byte Octet[3]; int Indice_palette; int Indice_couleur; @@ -4381,11 +4234,11 @@ void Load_KCF(void) if ((Fichier=open(Nom_du_fichier,O_RDONLY|O_BINARY))!=-1) { Taille_du_fichier=filelength(Fichier); - if (Taille_du_fichier==sizeof(struct KCF_Header)) + if (Taille_du_fichier==sizeof(T_KCF_Header)) { // Fichier KCF à l'ancien format - if (read(Fichier,&Buffer,sizeof(struct KCF_Header))==sizeof(struct KCF_Header)) + if (read(Fichier,&Buffer,sizeof(T_KCF_Header))==sizeof(T_KCF_Header)) { // Initialiser_preview(???); // Pas possible... pas d'image... @@ -4419,7 +4272,7 @@ void Load_KCF(void) { // Fichier KCF au nouveau format - if (read(Fichier,&Header2,sizeof(struct CEL_Header2))==sizeof(struct CEL_Header2)) + if (read(Fichier,&Header2,sizeof(T_CEL_Header2))==sizeof(T_CEL_Header2)) { // Initialiser_preview(???); // Pas possible... pas d'image... @@ -4481,29 +4334,8 @@ void Save_KCF(void) { char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; int Fichier; - struct KCF_Header - { - struct - { - struct - { - byte Octet1; - byte Octet2; - } Couleur[16]; - } Palette[10]; - } Buffer; - struct CEL_Header2 - { - byte Signa[4]; // Signature du format - byte Kind; // Type de fichier ($10=PALette $20=BitMaP) - byte Nbbits; // Nombre de bits - word Filler1; // ??? - word Largeur; // Largeur de l'image ou nb de couleurs définies - word Hauteur; // Hauteur de l'image ou nb de palettes définies - word Decalage_X; // Decalage en X de l'image - word Decalage_Y; // Decalage en Y de l'image - byte Filler2[16]; // ??? - } Header2; + T_KCF_Header Buffer; + T_CEL_Header2 Header2; byte Octet[3]; int Indice_palette; int Indice_couleur; @@ -4534,7 +4366,7 @@ void Save_KCF(void) Buffer.Palette[Indice_palette].Couleur[Indice_couleur].Octet2=Principal_Palette[Indice].V>>2; } - if (write(Fichier,&Buffer,sizeof(struct KCF_Header))!=sizeof(struct KCF_Header)) + if (write(Fichier,&Buffer,sizeof(T_KCF_Header))!=sizeof(T_KCF_Header)) Erreur_fichier=1; } else @@ -4552,7 +4384,7 @@ void Save_KCF(void) for (Indice=0;Indice<16;Indice++) // Initialisation du filler 2 (???) Header2.Filler2[Indice]=0; - if (write(Fichier,&Header2,sizeof(struct CEL_Header2))!=sizeof(struct CEL_Header2)) + if (write(Fichier,&Header2,sizeof(T_CEL_Header2))!=sizeof(T_CEL_Header2)) Erreur_fichier=1; for (Indice=0;(Indice<256) && (!Erreur_fichier);Indice++) @@ -4583,7 +4415,14 @@ void Save_KCF(void) //////////////////////////////////// SCx //////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// - +typedef struct +{ + byte Filler1[4]; + word Largeur; + word Hauteur; + byte Filler2; + byte Plans; +} T_SCx_Header; // -- Tester si un fichier est au format SCx -------------------------------- void Test_SCx(void) @@ -4591,14 +4430,7 @@ void Test_SCx(void) int Handle; // Handle du fichier char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier //byte Signature[3]; - struct Header - { - byte Filler1[4]; - word Largeur; - word Hauteur; - byte Filler2; - byte Plans; - } SCx_Header; + T_SCx_Header SCx_Header; Nom_fichier_complet(Nom_du_fichier,0); @@ -4610,7 +4442,7 @@ void Test_SCx(void) if (Handle!=-1) { // Lecture et vérification de la signature - if ((read(Handle,&SCx_Header,sizeof(struct Header)))==sizeof(struct Header)) + if ((read(Handle,&SCx_Header,sizeof(T_SCx_Header)))==sizeof(T_SCx_Header)) { if ( (!memcmp(SCx_Header.Filler1,"RIX",3)) && SCx_Header.Largeur && SCx_Header.Hauteur) @@ -4630,14 +4462,7 @@ void Load_SCx(void) word Pos_X,Pos_Y; long Taille,Vraie_taille; long Taille_du_fichier; - struct Header - { - byte Filler1[4]; - word Largeur; - word Hauteur; - byte Filler2; - byte Plans; - } SCx_Header; + T_SCx_Header SCx_Header; T_Palette SCx_Palette; @@ -4649,7 +4474,7 @@ void Load_SCx(void) { Taille_du_fichier=filelength(Fichier); - if ((read(Fichier,&SCx_Header,sizeof(struct Header)))==sizeof(struct Header)) + if ((read(Fichier,&SCx_Header,sizeof(T_SCx_Header)))==sizeof(T_SCx_Header)) { Initialiser_preview(SCx_Header.Largeur,SCx_Header.Hauteur,Taille_du_fichier,FORMAT_SCx); if (Erreur_fichier==0) @@ -4721,14 +4546,7 @@ void Save_SCx(void) char Nom_du_fichier[TAILLE_CHEMIN_FICHIER]; // Nom complet du fichier int Fichier; short Pos_X,Pos_Y; - struct Header - { - byte Filler1[4]; - word Largeur; - word Hauteur; - word Filler2; - T_Palette Palette; - } SCx_Header; + T_SCx_Header SCx_Header; Nom_fichier_complet(Nom_du_fichier,1); @@ -4741,10 +4559,11 @@ void Save_SCx(void) memcpy(SCx_Header.Filler1,"RIX3",4); SCx_Header.Largeur=Principal_Largeur_image; SCx_Header.Hauteur=Principal_Hauteur_image; - SCx_Header.Filler2=0x00AF; - memcpy(SCx_Header.Palette,Principal_Palette,sizeof(T_Palette)); + SCx_Header.Filler2=0xAF; + SCx_Header.Plans=0x00; - if (write(Fichier,&SCx_Header,sizeof(struct Header))!=-1) + if (write(Fichier,&SCx_Header,sizeof(T_SCx_Header))!=-1 && + write(Fichier,&Principal_Palette,sizeof(T_Palette))!=-1) { Init_ecriture(); diff --git a/main.c b/main.c index 67c1c1ea..4813a7c7 100644 --- a/main.c +++ b/main.c @@ -216,8 +216,8 @@ void Analyse_de_la_ligne_de_commande(int argc,char * argv[]) Buffer=realpath(argv[1],NULL); _splitpath(Buffer,Principal_Repertoire_fichier,Principal_Nom_fichier); #else - Buffer = malloc(MAX_PATH); - _fullpath(Buffer,argv[1],MAX_PATH); + Buffer = malloc(TAILLE_CHEMIN_FICHIER); + _fullpath(Buffer,argv[1],TAILLE_CHEMIN_FICHIER); { // Découpage du nom canonique de fichier en chemin + nom. // On croirait que c'est du classique pour la LibC, mais non... diff --git a/struct.h b/struct.h index 75852a77..0b468a51 100644 --- a/struct.h +++ b/struct.h @@ -93,7 +93,8 @@ struct T_Drive // Déclaration du type d'élément qu'on va mémoriser dans la liste: struct Element_de_liste_de_fileselect { - char Nom[13]; // Le nom du fichier ou du répertoire + char NomAbrege[13]; // Le nom tel qu'affiché dans le fileselector + char NomComplet[256]; // Le nom du fichier ou du répertoire byte Type; // Type d'élément : 0 = Fichier, 1 = Répertoire // données de chaŒnage de la liste @@ -179,8 +180,8 @@ typedef struct char Commentaire[TAILLE_COMMENTAIRE+1]; // Commentaire de l'image - char Repertoire_fichier[256]; // |_ Nom complet = - char Nom_fichier[13]; // | Repertoire_fichier+"\"+Nom_fichier + char Repertoire_fichier[TAILLE_CHEMIN_FICHIER]; // |_ Nom complet = + char Nom_fichier[TAILLE_CHEMIN_FICHIER]; // | Repertoire_fichier+"\"+Nom_fichier byte Format_fichier; // Format auquel il faut lire et écrire le fichier /*