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
This commit is contained in:
Yves Rizoud 2009-11-26 23:34:51 +00:00
parent 3538abadb9
commit 224902e18e
2 changed files with 119 additions and 59 deletions

View File

@ -57,7 +57,12 @@ void Test_IMG(void)
if ((file=fopen(filename, "rb"))) if ((file=fopen(filename, "rb")))
{ {
// Lecture et vérification de la signature // 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)) if ( (!memcmp(IMG_header.Filler1,signature,6))
&& IMG_header.Width && IMG_header.Height) && IMG_header.Width && IMG_header.Height)
@ -87,14 +92,14 @@ void Load_IMG(void)
{ {
file_size=File_length_file(file); 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); buffer=(byte *)malloc(IMG_header.Width);
Init_preview(IMG_header.Width,IMG_header.Height,file_size,FORMAT_IMG,PIXEL_SIMPLE); 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)); memcpy(IMG_header.Palette,Main_palette,sizeof(T_Palette));
#if SDL_BYTEORDER == SDL_BIG_ENDIAN if (Write_bytes(file,IMG_header.Filler1,sizeof(IMG_header.Filler1))
IMG_header.Width = SDL_Swap16(IMG_header.Width); && Write_word_le(file,IMG_header.Width)
IMG_header.Height = SDL_Swap16(IMG_header.Height); && Write_word_le(file,IMG_header.Height)
#endif && 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(); Init_write_buffer();
@ -980,10 +986,9 @@ void Save_LBM(void)
//////////////////////////////////// BMP //////////////////////////////////// //////////////////////////////////// BMP ////////////////////////////////////
#pragma pack(1)
typedef struct typedef struct
{ {
word Signature; // ='BM' = 0x4D42 byte Signature[2]; // ='BM' = 0x4D42
dword Size_1; // file size dword Size_1; // file size
word Reserved_1; // 0 word Reserved_1; // 0
word Reserved_2; // 0 word Reserved_2; // 0
@ -1001,7 +1006,6 @@ typedef struct
dword Nb_Clr; dword Nb_Clr;
dword Clr_Imprt; dword Clr_Imprt;
} T_BMP_Header; } T_BMP_Header;
#pragma pack()
// -- Tester si un fichier est au format BMP -------------------------------- // -- Tester si un fichier est au format BMP --------------------------------
void Test_BMP(void) void Test_BMP(void)
@ -1034,11 +1038,8 @@ void Test_BMP(void)
) )
{ {
#if SDL_BYTEORDER == SDL_BIG_ENDIAN if ( header.Signature[0]=='B' && header.Signature[1]=='M'
header.Signature = SDL_Swap16(header.Signature); && header.Size_2==40
#endif
if ( (header.Signature==0x4D42) && (header.Size_2==40)
&& header.Width && header.Height ) && header.Width && header.Height )
File_error=0; File_error=0;
} }
@ -1111,7 +1112,7 @@ void Load_BMP(void)
{ {
file_size=File_length_file(file); 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_dword_le(file,&(header.Size_1))
&& Read_word_le(file,&(header.Reserved_1)) && Read_word_le(file,&(header.Reserved_1))
&& Read_word_le(file,&(header.Reserved_2)) && Read_word_le(file,&(header.Reserved_2))
@ -1461,11 +1462,8 @@ void Save_BMP(void)
else else
line_size=Main_image_width; line_size=Main_image_width;
#if SDL_BYTEORDER == SDL_BIG_ENDIAN header.Signature[0] = 'B';
header.Signature = 0x424D; header.Signature[1] = 'M';
#else
header.Signature = 0x4D42;
#endif
header.Size_1 =(line_size*Main_image_height)+1078; header.Size_1 =(line_size*Main_image_height)+1078;
header.Reserved_1 =0; header.Reserved_1 =0;
header.Reserved_2 =0; header.Reserved_2 =0;
@ -1482,18 +1480,22 @@ void Save_BMP(void)
header.Nb_Clr =0; header.Nb_Clr =0;
header.Clr_Imprt =0; header.Clr_Imprt =0;
#if SDL_BYTEORDER == SDL_BIG_ENDIAN if (Write_bytes(file,header.Signature,2)
header.Size_1 = SDL_Swap32( header.Size_1 ); && Write_dword_le(file,header.Size_1)
header.Offset = SDL_Swap32( header.Offset ); && Write_word_le(file,header.Reserved_1)
header.Size_2 = SDL_Swap32( header.Size_2 ); && Write_word_le(file,header.Reserved_2)
header.Width = SDL_Swap32( header.Width ); && Write_dword_le(file,header.Offset)
header.Height = SDL_Swap32( header.Height ); && Write_dword_le(file,header.Size_2)
header.Planes = SDL_Swap16( header.Planes ); && Write_dword_le(file,header.Width)
header.Nb_bits = SDL_Swap16( header.Nb_bits ); && Write_dword_le(file,header.Height)
// If you ever set any more fields to non-zero, please swap here! && Write_word_le(file,header.Planes)
#endif && Write_word_le(file,header.Nb_bits)
&& Write_dword_le(file,header.Compression)
if (Write_bytes(file,&header,sizeof(T_BMP_Header))) && 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 // 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 // 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"))) if ((file=fopen(filename, "rb")))
{ {
file_size=File_length_file(file); file_size=File_length_file(file);
/*
if (Read_bytes(file,&PCX_header,sizeof(T_PCX_Header)))
{*/
if (Read_byte(file,&(PCX_header.Manufacturer)) && if (Read_byte(file,&(PCX_header.Manufacturer)) &&
Read_byte(file,&(PCX_header.Version)) && Read_byte(file,&(PCX_header.Version)) &&
Read_byte(file,&(PCX_header.Compression)) && Read_byte(file,&(PCX_header.Compression)) &&
@ -2976,7 +2974,6 @@ void Save_PCX(void)
//////////////////////////////////// SCx //////////////////////////////////// //////////////////////////////////// SCx ////////////////////////////////////
#pragma pack(1)
typedef struct typedef struct
{ {
byte Filler1[4]; byte Filler1[4];
@ -2985,7 +2982,6 @@ typedef struct
byte Filler2; byte Filler2;
byte Planes; byte Planes;
} T_SCx_Header; } T_SCx_Header;
#pragma pack()
// -- Tester si un fichier est au format SCx -------------------------------- // -- Tester si un fichier est au format SCx --------------------------------
void Test_SCx(void) void Test_SCx(void)
@ -3004,7 +3000,12 @@ void Test_SCx(void)
if ((file=fopen(filename, "rb"))) if ((file=fopen(filename, "rb")))
{ {
// Lecture et vérification de la signature // 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)) if ( (!memcmp(SCx_header.Filler1,"RIX",3))
&& SCx_header.Width && SCx_header.Height) && SCx_header.Width && SCx_header.Height)
@ -3035,7 +3036,12 @@ void Load_SCx(void)
{ {
file_size=File_length_file(file); 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); Init_preview(SCx_header.Width,SCx_header.Height,file_size,FORMAT_SCx,PIXEL_SIMPLE);
if (File_error==0) if (File_error==0)
@ -3127,8 +3133,13 @@ void Save_SCx(void)
SCx_header.Filler2=0xAF; SCx_header.Filler2=0xAF;
SCx_header.Planes=0x00; SCx_header.Planes=0x00;
if (Write_bytes(file,&SCx_header,sizeof(T_SCx_Header)) && if (Write_bytes(file,SCx_header.Filler1,sizeof(SCx_header.Filler1))
Write_bytes(file,&palette_64,sizeof(T_Palette))) && 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(); Init_write_buffer();

View File

@ -750,16 +750,18 @@ void Load_CEL(void)
short y_pos; short y_pos;
byte last_byte=0; byte last_byte=0;
long file_size; long file_size;
const long int header_size = (long int)(sizeof(header1.Width)+sizeof(header1.Height));
File_error=0; File_error=0;
Get_full_filename(filename,0); Get_full_filename(filename,0);
if ((file=fopen(filename, "rb"))) 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); file_size=File_length_file(file);
if ( (file_size>(long int)sizeof(T_CEL_Header1)) if ( (file_size>header_size)
&& ( (((header1.Width+1)>>1)*header1.Height)==(file_size-(long int)sizeof(T_CEL_Header1)) ) ) && ( (((header1.Width+1)>>1)*header1.Height)==(file_size-header_size) ) )
{ {
// Chargement d'un fichier CEL sans signature (vieux fichiers) // Chargement d'un fichier CEL sans signature (vieux fichiers)
Main_image_width=header1.Width; Main_image_width=header1.Width;
@ -788,7 +790,16 @@ void Load_CEL(void)
// On réessaye avec le nouveau format // On réessaye avec le nouveau format
fseek(file,0,SEEK_SET); 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) // Chargement d'un fichier CEL avec signature (nouveaux fichiers)
@ -887,7 +898,9 @@ void Save_CEL(void)
header1.Width =Main_image_width; header1.Width =Main_image_width;
header1.Height=Main_image_height; 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 // Sauvegarde de l'image
Init_write_buffer(); Init_write_buffer();
@ -944,7 +957,16 @@ void Save_CEL(void)
for (x_pos=0;x_pos<16;x_pos++) // Initialisation du filler 2 (?) for (x_pos=0;x_pos<16;x_pos++) // Initialisation du filler 2 (?)
header2.Filler2[x_pos]=0; 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 // Sauvegarde de l'image
Init_write_buffer(); Init_write_buffer();
@ -1007,7 +1029,16 @@ void Test_KCF(void)
} }
else 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) if (memcmp(header2.Signature,"KiSS",4)==0)
{ {
@ -1085,7 +1116,16 @@ void Load_KCF(void)
{ {
// Fichier KCF au nouveau format // 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... // 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 (?) for (index=0;index<16;index++) // Initialisation du filler 2 (?)
header2.Filler2[index]=0; 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; File_error=1;
for (index=0;(index<256) && (!File_error);index++) 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 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; word numcolors;
dword cusage[256]; dword cusage[256];
byte colors[1000],bitmap[8000]; byte colors[1000],bitmap[8000];