From 224902e18e39ba5fbd611f56bb5bdb788d6a4789 Mon Sep 17 00:00:00 2001 From: Yves Rizoud Date: Thu, 26 Nov 2009 23:34:51 +0000 Subject: [PATCH] Some endianness fixes in load/save of formats KCF, IMG, CEL, IMG, BMP. Now all file operations are done directly with the right endianness. git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@1226 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- fileformats.c | 109 +++++++++++++++++++++++++--------------------- miscfileformats.c | 69 ++++++++++++++++++++++++----- 2 files changed, 119 insertions(+), 59 deletions(-) diff --git a/fileformats.c b/fileformats.c index 3a5b156d..1ebf6ed2 100644 --- a/fileformats.c +++ b/fileformats.c @@ -57,7 +57,12 @@ void Test_IMG(void) if ((file=fopen(filename, "rb"))) { // Lecture et vérification de la signature - if (Read_bytes(file,&IMG_header,sizeof(T_IMG_Header))) + if (Read_bytes(file,IMG_header.Filler1,sizeof(IMG_header.Filler1)) + && Read_word_le(file,&(IMG_header.Width)) + && Read_word_le(file,&(IMG_header.Height)) + && Read_bytes(file,IMG_header.Filler2,sizeof(IMG_header.Filler2)) + && Read_bytes(file,IMG_header.Palette,sizeof(IMG_header.Palette)) + ) { if ( (!memcmp(IMG_header.Filler1,signature,6)) && IMG_header.Width && IMG_header.Height) @@ -87,14 +92,14 @@ void Load_IMG(void) { file_size=File_length_file(file); - if (Read_bytes(file,&IMG_header,sizeof(T_IMG_Header))) + if (Read_bytes(file,IMG_header.Filler1,sizeof(IMG_header.Filler1)) + && Read_word_le(file,&(IMG_header.Width)) + && Read_word_le(file,&(IMG_header.Height)) + && Read_bytes(file,IMG_header.Filler2,sizeof(IMG_header.Filler2)) + && Read_bytes(file,IMG_header.Palette,sizeof(IMG_header.Palette)) + ) { -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - IMG_header.Width = SDL_Swap16(IMG_header.Width); - IMG_header.Height = SDL_Swap16(IMG_header.Height); -#endif - buffer=(byte *)malloc(IMG_header.Width); Init_preview(IMG_header.Width,IMG_header.Height,file_size,FORMAT_IMG,PIXEL_SIMPLE); @@ -160,12 +165,13 @@ void Save_IMG(void) memcpy(IMG_header.Palette,Main_palette,sizeof(T_Palette)); -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - IMG_header.Width = SDL_Swap16(IMG_header.Width); - IMG_header.Height = SDL_Swap16(IMG_header.Height); -#endif + if (Write_bytes(file,IMG_header.Filler1,sizeof(IMG_header.Filler1)) + && Write_word_le(file,IMG_header.Width) + && Write_word_le(file,IMG_header.Height) + && Write_bytes(file,IMG_header.Filler2,sizeof(IMG_header.Filler2)) + && Write_bytes(file,IMG_header.Palette,sizeof(IMG_header.Palette)) + ) - if (Write_bytes(file,&IMG_header,sizeof(T_IMG_Header))) { Init_write_buffer(); @@ -980,10 +986,9 @@ void Save_LBM(void) //////////////////////////////////// BMP //////////////////////////////////// -#pragma pack(1) typedef struct { - word Signature; // ='BM' = 0x4D42 + byte Signature[2]; // ='BM' = 0x4D42 dword Size_1; // file size word Reserved_1; // 0 word Reserved_2; // 0 @@ -1001,7 +1006,6 @@ typedef struct dword Nb_Clr; dword Clr_Imprt; } T_BMP_Header; -#pragma pack() // -- Tester si un fichier est au format BMP -------------------------------- void Test_BMP(void) @@ -1034,11 +1038,8 @@ void Test_BMP(void) ) { -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - header.Signature = SDL_Swap16(header.Signature); -#endif - - if ( (header.Signature==0x4D42) && (header.Size_2==40) + if ( header.Signature[0]=='B' && header.Signature[1]=='M' + && header.Size_2==40 && header.Width && header.Height ) File_error=0; } @@ -1111,7 +1112,7 @@ void Load_BMP(void) { file_size=File_length_file(file); - if (Read_word_le(file,&(header.Signature)) + if (Read_bytes(file,header.Signature,2) && Read_dword_le(file,&(header.Size_1)) && Read_word_le(file,&(header.Reserved_1)) && Read_word_le(file,&(header.Reserved_2)) @@ -1461,11 +1462,8 @@ void Save_BMP(void) else line_size=Main_image_width; -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - header.Signature = 0x424D; -#else - header.Signature = 0x4D42; -#endif + header.Signature[0] = 'B'; + header.Signature[1] = 'M'; header.Size_1 =(line_size*Main_image_height)+1078; header.Reserved_1 =0; header.Reserved_2 =0; @@ -1482,18 +1480,22 @@ void Save_BMP(void) header.Nb_Clr =0; header.Clr_Imprt =0; -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - header.Size_1 = SDL_Swap32( header.Size_1 ); - header.Offset = SDL_Swap32( header.Offset ); - header.Size_2 = SDL_Swap32( header.Size_2 ); - header.Width = SDL_Swap32( header.Width ); - header.Height = SDL_Swap32( header.Height ); - header.Planes = SDL_Swap16( header.Planes ); - header.Nb_bits = SDL_Swap16( header.Nb_bits ); - // If you ever set any more fields to non-zero, please swap here! -#endif - - if (Write_bytes(file,&header,sizeof(T_BMP_Header))) + if (Write_bytes(file,header.Signature,2) + && Write_dword_le(file,header.Size_1) + && Write_word_le(file,header.Reserved_1) + && Write_word_le(file,header.Reserved_2) + && Write_dword_le(file,header.Offset) + && Write_dword_le(file,header.Size_2) + && Write_dword_le(file,header.Width) + && Write_dword_le(file,header.Height) + && Write_word_le(file,header.Planes) + && Write_word_le(file,header.Nb_bits) + && Write_dword_le(file,header.Compression) + && Write_dword_le(file,header.Size_3) + && Write_dword_le(file,header.XPM) + && Write_dword_le(file,header.YPM) + && Write_dword_le(file,header.Nb_Clr) + && Write_dword_le(file,header.Clr_Imprt)) { // 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 @@ -2562,11 +2564,7 @@ void Load_PCX(void) if ((file=fopen(filename, "rb"))) { - file_size=File_length_file(file); - /* - if (Read_bytes(file,&PCX_header,sizeof(T_PCX_Header))) - {*/ - + file_size=File_length_file(file); if (Read_byte(file,&(PCX_header.Manufacturer)) && Read_byte(file,&(PCX_header.Version)) && Read_byte(file,&(PCX_header.Compression)) && @@ -2976,7 +2974,6 @@ void Save_PCX(void) //////////////////////////////////// SCx //////////////////////////////////// -#pragma pack(1) typedef struct { byte Filler1[4]; @@ -2985,7 +2982,6 @@ typedef struct byte Filler2; byte Planes; } T_SCx_Header; -#pragma pack() // -- Tester si un fichier est au format SCx -------------------------------- void Test_SCx(void) @@ -3004,7 +3000,12 @@ void Test_SCx(void) if ((file=fopen(filename, "rb"))) { // Lecture et vérification de la signature - if ((Read_bytes(file,&SCx_header,sizeof(T_SCx_Header)))) + if (Read_bytes(file,SCx_header.Filler1,sizeof(SCx_header.Filler1)) + && Read_word_le(file, &(SCx_header.Width)) + && Read_word_le(file, &(SCx_header.Height)) + && Read_byte(file, &(SCx_header.Filler2)) + && Read_byte(file, &(SCx_header.Planes)) + ) { if ( (!memcmp(SCx_header.Filler1,"RIX",3)) && SCx_header.Width && SCx_header.Height) @@ -3035,7 +3036,12 @@ void Load_SCx(void) { file_size=File_length_file(file); - if ((Read_bytes(file,&SCx_header,sizeof(T_SCx_Header)))) + if (Read_bytes(file,SCx_header.Filler1,sizeof(SCx_header.Filler1)) + && Read_word_le(file, &(SCx_header.Width)) + && Read_word_le(file, &(SCx_header.Height)) + && Read_byte(file, &(SCx_header.Filler2)) + && Read_byte(file, &(SCx_header.Planes)) + ) { Init_preview(SCx_header.Width,SCx_header.Height,file_size,FORMAT_SCx,PIXEL_SIMPLE); if (File_error==0) @@ -3127,8 +3133,13 @@ void Save_SCx(void) SCx_header.Filler2=0xAF; SCx_header.Planes=0x00; - if (Write_bytes(file,&SCx_header,sizeof(T_SCx_Header)) && - Write_bytes(file,&palette_64,sizeof(T_Palette))) + if (Write_bytes(file,SCx_header.Filler1,sizeof(SCx_header.Filler1)) + && Write_word_le(file, SCx_header.Width) + && Write_word_le(file, SCx_header.Height) + && Write_byte(file, SCx_header.Filler2) + && Write_byte(file, SCx_header.Planes) + && Write_bytes(file,&palette_64,sizeof(T_Palette)) + ) { Init_write_buffer(); diff --git a/miscfileformats.c b/miscfileformats.c index 859147e8..dbb5917f 100644 --- a/miscfileformats.c +++ b/miscfileformats.c @@ -750,16 +750,18 @@ void Load_CEL(void) short y_pos; byte last_byte=0; long file_size; + const long int header_size = (long int)(sizeof(header1.Width)+sizeof(header1.Height)); File_error=0; Get_full_filename(filename,0); if ((file=fopen(filename, "rb"))) { - if (Read_bytes(file,&header1,sizeof(T_CEL_Header1))) + if (Read_word_le(file,&(header1.Width)) + && Read_word_le(file,&(header1.Height))) { file_size=File_length_file(file); - if ( (file_size>(long int)sizeof(T_CEL_Header1)) - && ( (((header1.Width+1)>>1)*header1.Height)==(file_size-(long int)sizeof(T_CEL_Header1)) ) ) + if ( (file_size>header_size) + && ( (((header1.Width+1)>>1)*header1.Height)==(file_size-header_size) ) ) { // Chargement d'un fichier CEL sans signature (vieux fichiers) Main_image_width=header1.Width; @@ -788,7 +790,16 @@ void Load_CEL(void) // On réessaye avec le nouveau format fseek(file,0,SEEK_SET); - if (Read_bytes(file,&header2,sizeof(T_CEL_Header2))) + if (Read_bytes(file,header2.Signature,sizeof(header2.Signature)) + && Read_byte(file,&(header2.Kind)) + && Read_byte(file,&(header2.Nb_bits)) + && Read_word_le(file,&(header2.Filler1)) + && Read_word_le(file,&(header2.Width)) + && Read_word_le(file,&(header2.Height)) + && Read_word_le(file,&(header2.X_offset)) + && Read_word_le(file,&(header2.Y_offset)) + && Read_bytes(file,header2.Filler2,sizeof(header2.Filler2)) + ) { // Chargement d'un fichier CEL avec signature (nouveaux fichiers) @@ -887,7 +898,9 @@ void Save_CEL(void) header1.Width =Main_image_width; header1.Height=Main_image_height; - if (Write_bytes(file,&header1,sizeof(T_CEL_Header1))) + if (Write_word_le(file,header1.Width) + && Write_word_le(file,header1.Height) + ) { // Sauvegarde de l'image Init_write_buffer(); @@ -944,7 +957,16 @@ void Save_CEL(void) for (x_pos=0;x_pos<16;x_pos++) // Initialisation du filler 2 (?) header2.Filler2[x_pos]=0; - if (Write_bytes(file,&header2,sizeof(T_CEL_Header2))) + if (Write_bytes(file,header2.Signature,sizeof(header2.Signature)) + && Write_byte(file,header2.Kind) + && Write_byte(file,header2.Nb_bits) + && Write_word_le(file,header2.Filler1) + && Write_word_le(file,header2.Width) + && Write_word_le(file,header2.Height) + && Write_word_le(file,header2.X_offset) + && Write_word_le(file,header2.Y_offset) + && Write_bytes(file,header2.Filler2,sizeof(header2.Filler2)) + ) { // Sauvegarde de l'image Init_write_buffer(); @@ -1007,7 +1029,16 @@ void Test_KCF(void) } else { - if (Read_bytes(file,&header2,sizeof(T_CEL_Header2))) + if (Read_bytes(file,header2.Signature,sizeof(header2.Signature)) + && Read_byte(file,&(header2.Kind)) + && Read_byte(file,&(header2.Nb_bits)) + && Read_word_le(file,&(header2.Filler1)) + && Read_word_le(file,&(header2.Width)) + && Read_word_le(file,&(header2.Height)) + && Read_word_le(file,&(header2.X_offset)) + && Read_word_le(file,&(header2.Y_offset)) + && Read_bytes(file,header2.Filler2,sizeof(header2.Filler2)) + ) { if (memcmp(header2.Signature,"KiSS",4)==0) { @@ -1085,7 +1116,16 @@ void Load_KCF(void) { // Fichier KCF au nouveau format - if (Read_bytes(file,&header2,sizeof(T_CEL_Header2))) + if (Read_bytes(file,header2.Signature,sizeof(header2.Signature)) + && Read_byte(file,&(header2.Kind)) + && Read_byte(file,&(header2.Nb_bits)) + && Read_word_le(file,&(header2.Filler1)) + && Read_word_le(file,&(header2.Width)) + && Read_word_le(file,&(header2.Height)) + && Read_word_le(file,&(header2.X_offset)) + && Read_word_le(file,&(header2.Y_offset)) + && Read_bytes(file,header2.Filler2,sizeof(header2.Filler2)) + ) { // Init_preview(?); // Pas possible... pas d'image... @@ -1197,7 +1237,16 @@ void Save_KCF(void) for (index=0;index<16;index++) // Initialisation du filler 2 (?) header2.Filler2[index]=0; - if (! Write_bytes(file,&header2,sizeof(T_CEL_Header2))) + if (!Write_bytes(file,header2.Signature,sizeof(header2.Signature)) + || !Write_byte(file,header2.Kind) + || !Write_byte(file,header2.Nb_bits) + || !Write_word_le(file,header2.Filler1) + || !Write_word_le(file,header2.Width) + || !Write_word_le(file,header2.Height) + || !Write_word_le(file,header2.X_offset) + || !Write_word_le(file,header2.Y_offset) + || !Write_bytes(file,header2.Filler2,sizeof(header2.Filler2)) + ) File_error=1; for (index=0;(index<256) && (!File_error);index++) @@ -2301,7 +2350,7 @@ int Save_C64_window(byte *saveWhat, byte *loadAddr) int Save_C64_hires(char *filename, byte saveWhat, byte loadAddr) { - int cx,cy,x,y,c1,c2,i,pixel,bits,pos=0; + int cx,cy,x,y,c1,c2=0,i,pixel,bits,pos=0; word numcolors; dword cusage[256]; byte colors[1000],bitmap[8000];