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:
parent
3538abadb9
commit
224902e18e
109
fileformats.c
109
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();
|
||||
|
||||
|
||||
@ -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];
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user