From 2b609d6e033ae9394efb9cc7385e818f33d16e0b Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Thu, 14 Aug 2008 20:21:11 +0000 Subject: [PATCH] -BMP Loading -Fixed PCX loading -Some work on ILBM loading -Little adaptation for long filenames (does not crash anymore, but there are display bugs) -Some other small fixes i can't remember git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@123 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- divers.c | 4 +- global.h | 6 +-- loadsave.c | 130 +++++++++++++++++++++++++++++++--------------------- sdlscreen.c | 9 +++- 4 files changed, 91 insertions(+), 58 deletions(-) diff --git a/divers.c b/divers.c index 2e22f589..c05c3ce1 100644 --- a/divers.c +++ b/divers.c @@ -625,10 +625,10 @@ byte Couleur_ILBM_line(word Pos_X, word Vraie_taille_ligne) int ax,bh,dx; byte bl=0; - for(dx = HBPm1;dx>=0;dx--); + for(dx = HBPm1;dx>0;dx--); { //CIL_Loop - ax = (Vraie_taille_ligne * HBPm1 + Pos_X) >> 3; + ax = (Vraie_taille_ligne * dx + Pos_X) >> 3; bh = (LBM_Buffer[ax] >> cl) & 1; bl = (bl << 1) + bh; diff --git a/global.h b/global.h index 53cf2c77..9cc0b400 100644 --- a/global.h +++ b/global.h @@ -216,13 +216,13 @@ GLOBAL short Ancien_Principal_Decalage_Y; GLOBAL char Principal_Drive_fichier[2]; #endif -GLOBAL char Principal_Repertoire_fichier[256]; // |_ Nom complet = -GLOBAL char Principal_Nom_fichier[13]; // | Repertoire_fichier+"\"+Nom_fichier +GLOBAL char Principal_Repertoire_fichier[1024]; // |_ Nom complet = +GLOBAL char Principal_Nom_fichier[256]; // | Repertoire_fichier+"\"+Nom_fichier GLOBAL byte Principal_Format_fichier; // Format auquel il faut lire et Úcrire le fichier GLOBAL byte Principal_Format; // Format du fileselect GLOBAL short Principal_File_list_Position; // DÚbut de la partie affichÚe dans la liste de fichiers GLOBAL short Principal_File_list_Decalage; // DÚcalage de la barre de sÚlection dans le fileselector -GLOBAL char Principal_Repertoire_courant[256]; // RÚpertoire actuel sur disque +GLOBAL char Principal_Repertoire_courant[1024]; // RÚpertoire actuel sur disque GLOBAL char Principal_Commentaire[TAILLE_COMMENTAIRE+1]; // Commentaire de l'image GLOBAL short Principal_Split; // Position en X du bord gauche du split de la loupe diff --git a/loadsave.c b/loadsave.c index 900c1566..274b7f07 100644 --- a/loadsave.c +++ b/loadsave.c @@ -1395,9 +1395,9 @@ void Test_LBM(void) else { Lire_long(); // On aurait pu vérifier que ce long est égal à la taille - // du fichier - 8, mais ‡a aurait interdit de charger des + // du fichier - 8, mais ça aurait interdit de charger des // fichiers tronqués (et déjà que c'est chiant de perdre - // une partie du fichier il faut quand mˆme pouvoir en + // une partie du fichier il faut quand même pouvoir en // garder un peu... Sinon, moi je pleure :'( !!! ) if (read(LBM_Fichier,Format,4)!=4) Erreur_fichier=1; @@ -1555,7 +1555,9 @@ void Test_LBM(void) if (Image_HAM<=1) // ILBM { for (Pos_X=0; Pos_X 127 alors il faut répéter 256-'Octet' fois la couleur de l'octet suivant + // Si Octet <= 127 alors il faut afficher directement les 'Octet' octets suivants if (Octet>127) { Couleur=Lire_octet(LBM_Fichier); @@ -2121,43 +2128,62 @@ void Save_LBM(void) ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// +struct BMP_Header +{ + word Signature; // ='BM' = 0x4D42 + uint32_t Taille_1; // =Taille du fichier + word Reserv_1; // =0 + word Reserv_2; // =0 + uint32_t Decalage; // Nb octets avant les données bitmap + + uint32_t Taille_2; // =40 + uint32_t Largeur; + uint32_t Hauteur; + word Plans; // =1 + word Nb_bits; // =1,4,8 ou 24 + uint32_t Compression; + uint32_t Taille_3; + uint32_t XPM; + uint32_t YPM; + uint32_t Nb_Clr; + uint32_t Clr_Imprt; +}; // -- Tester si un fichier est au format BMP -------------------------------- void Test_BMP(void) { char Nom_du_fichier[256]; 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; - + struct BMP_Header Header; Erreur_fichier=1; Nom_fichier_complet(Nom_du_fichier,0); if ((Fichier=open(Nom_du_fichier,O_RDONLY))!=-1) { - if (read(Fichier,&Header,sizeof(struct BMP_Header))==sizeof(struct BMP_Header)) + if (read(Fichier,&(Header.Signature),sizeof(word))==sizeof(word) + && read(Fichier,&(Header.Taille_1),sizeof(uint32_t))==sizeof(uint32_t) + && read(Fichier,&(Header.Reserv_1),sizeof(word))==sizeof(word) + && read(Fichier,&(Header.Reserv_2),sizeof(word))==sizeof(word) + && read(Fichier,&(Header.Decalage),sizeof(uint32_t))==sizeof(uint32_t) + && read(Fichier,&(Header.Taille_2),sizeof(uint32_t))==sizeof(uint32_t) + && read(Fichier,&(Header.Largeur),sizeof(uint32_t))==sizeof(uint32_t) + && read(Fichier,&(Header.Hauteur),sizeof(uint32_t))==sizeof(uint32_t) + && read(Fichier,&(Header.Plans),sizeof(word))==sizeof(word) + && read(Fichier,&(Header.Nb_bits),sizeof(word))==sizeof(word) + && read(Fichier,&(Header.Compression),sizeof(uint32_t))==sizeof(uint32_t) + && read(Fichier,&(Header.Taille_3),sizeof(uint32_t))==sizeof(uint32_t) + && read(Fichier,&(Header.XPM),sizeof(uint32_t))==sizeof(uint32_t) + && read(Fichier,&(Header.YPM),sizeof(uint32_t))==sizeof(uint32_t) + && read(Fichier,&(Header.Nb_Clr),sizeof(uint32_t))==sizeof(uint32_t) + && read(Fichier,&(Header.Clr_Imprt),sizeof(uint32_t))==sizeof(uint32_t) + + ) + { if ( (Header.Signature==0x4D42) && (Header.Taille_2==40) && Header.Largeur && Header.Hauteur ) Erreur_fichier=0; + } close(Fichier); } } @@ -2168,26 +2194,7 @@ void Load_BMP(void) { char Nom_du_fichier[256]; 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; + struct BMP_Header Header; byte * Buffer; word Indice; byte Palette_locale[256][4]; // R,V,B,0 @@ -2197,7 +2204,7 @@ void Load_BMP(void) word Taille_ligne; byte A,B,C=0; long Taille_du_fichier; - struct stat* Informations_Fichier=NULL; + struct stat Informations_Fichier; Nom_fichier_complet(Nom_du_fichier,0); @@ -2206,10 +2213,26 @@ void Load_BMP(void) if ((Fichier=open(Nom_du_fichier,O_RDONLY))!=-1) { - stat(Nom_du_fichier,Informations_Fichier); - Taille_du_fichier=Informations_Fichier->st_size; + stat(Nom_du_fichier,&Informations_Fichier); + Taille_du_fichier=Informations_Fichier.st_size; - if (read(Fichier,&Header,sizeof(struct BMP_Header))==sizeof(struct BMP_Header)) + if (read(Fichier,&(Header.Signature),sizeof(word))==sizeof(word) + && read(Fichier,&(Header.Taille_1),sizeof(uint32_t))==sizeof(uint32_t) + && read(Fichier,&(Header.Reserv_1),sizeof(word))==sizeof(word) + && read(Fichier,&(Header.Reserv_2),sizeof(word))==sizeof(word) + && read(Fichier,&(Header.Decalage),sizeof(uint32_t))==sizeof(uint32_t) + && read(Fichier,&(Header.Taille_2),sizeof(uint32_t))==sizeof(uint32_t) + && read(Fichier,&(Header.Largeur),sizeof(uint32_t))==sizeof(uint32_t) + && read(Fichier,&(Header.Hauteur),sizeof(uint32_t))==sizeof(uint32_t) + && read(Fichier,&(Header.Plans),sizeof(word))==sizeof(word) + && read(Fichier,&(Header.Nb_bits),sizeof(word))==sizeof(word) + && read(Fichier,&(Header.Compression),sizeof(uint32_t))==sizeof(uint32_t) + && read(Fichier,&(Header.Taille_3),sizeof(uint32_t))==sizeof(uint32_t) + && read(Fichier,&(Header.XPM),sizeof(uint32_t))==sizeof(uint32_t) + && read(Fichier,&(Header.YPM),sizeof(uint32_t))==sizeof(uint32_t) + && read(Fichier,&(Header.Nb_Clr),sizeof(uint32_t))==sizeof(uint32_t) + && read(Fichier,&(Header.Clr_Imprt),sizeof(uint32_t))==sizeof(uint32_t) + ) { switch (Header.Nb_bits) { @@ -2232,7 +2255,7 @@ void Load_BMP(void) { if (read(Fichier,Palette_locale,Nb_Couleurs<<2)==(Nb_Couleurs<<2)) { - // On commence par passer la palette en 256 comme ‡a, si la nouvelle + // On commence par passer la palette en 256 comme ça, si la nouvelle // palette a moins de 256 coul, la précédente ne souffrira pas d'un // assombrissement préjudiciable. if (Config.Clear_palette) @@ -3475,7 +3498,7 @@ void Load_PCX(void) 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 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 @@ -3565,12 +3588,15 @@ void Load_PCX(void) { int indice; // On lit la palette 256c que ces crétins ont foutue à la fin du fichier - for(indice=0;indice<256;indice++); + for(indice=0;indice<256;indice++) if ((read(Fichier,&Principal_Palette[indice].R,1)!=1) || (read(Fichier,&Principal_Palette[indice].V,1)!=1) || (read(Fichier,&Principal_Palette[indice].B,1)!=1)) - + { Erreur_fichier=2; + DEBUG("ERROR READING PCX PALETTE !",indice); + break; + } } } Palette_256_to_64(Principal_Palette); diff --git a/sdlscreen.c b/sdlscreen.c index 1993faf4..932f8251 100644 --- a/sdlscreen.c +++ b/sdlscreen.c @@ -441,8 +441,15 @@ void Set_Mode_SDL() #else #define FLAGS SDL_FULLSCREEN #endif + + DEBUG("Mode L",Largeur_ecran); + DEBUG("Mode H",Hauteur_ecran); + Ecran_SDL=SDL_SetVideoMode(Largeur_ecran,Hauteur_ecran,8,FLAGS); - Ecran=Ecran_SDL->pixels; + if(Ecran_SDL != NULL) + Ecran=Ecran_SDL->pixels; + else + DEBUG("Erreur changement de mode video !!",0); SDL_ShowCursor(0); // Cache le curseur SDL, on le gère en soft }