Reorganize Load_IFF()
This commit is contained in:
parent
b70d49349a
commit
14cce41ba9
@ -300,6 +300,7 @@ void Test_IFF(T_IO_Context * context, const char *sub_type)
|
||||
} while (0);
|
||||
|
||||
fclose(IFF_file);
|
||||
IFF_file = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@ -640,42 +641,39 @@ void Load_IFF(T_IO_Context * context)
|
||||
&& (Read_word_be(IFF_file,&header.Y_screen))
|
||||
&& header.Width && header.Height)
|
||||
{
|
||||
if ( (header.BitPlanes) && (IFF_Wait_for("CMAP")) )
|
||||
byte real_bit_planes = header.BitPlanes;
|
||||
if (header.Mask==1)
|
||||
header.BitPlanes++;
|
||||
Back_color=header.Transp_col;
|
||||
Image_HAM=0;
|
||||
// TODO parse X / Y aspect
|
||||
|
||||
while (File_error == 0
|
||||
&& Read_bytes(IFF_file,section,4)
|
||||
&& Read_dword_be(IFF_file,§ion_size))
|
||||
{
|
||||
Read_dword_be(IFF_file,&nb_colors);
|
||||
nb_colors/=3;
|
||||
|
||||
if (((dword)1<<header.BitPlanes)!=nb_colors)
|
||||
if (memcmp(section, "CMAP", 4) == 0)
|
||||
{
|
||||
if ((nb_colors==32) && (header.BitPlanes==6))
|
||||
{ // Ce n'est pas une image HAM mais une image 64 coul.
|
||||
Image_HAM=1; // Sauvée en 32 coul. => il faut copier les 32 coul.
|
||||
} // sur les 32 suivantes et assombrir ces dernières.
|
||||
else
|
||||
nb_colors = section_size/3;
|
||||
|
||||
if (((dword)1<<header.BitPlanes)!=nb_colors)
|
||||
{
|
||||
if ((header.BitPlanes==6) || (header.BitPlanes==8))
|
||||
Image_HAM=header.BitPlanes;
|
||||
if ((nb_colors==32) && (header.BitPlanes==6))
|
||||
{ // This is a Extra Half-Brite (EHB) 64 color image.
|
||||
Image_HAM=1; // 32 colors in the palette.
|
||||
} // The next 32 colors are the same with values divided by 2
|
||||
else
|
||||
/* File_error=1;*/ /* C'est censé être incorrect mais j'ai */
|
||||
Image_HAM=0; /* trouvé un fichier comme ça, alors... */
|
||||
{
|
||||
if ((header.BitPlanes==6) || (header.BitPlanes==8))
|
||||
Image_HAM=header.BitPlanes;
|
||||
else
|
||||
/* File_error=1;*/ /* C'est censé être incorrect mais j'ai */
|
||||
Image_HAM=0; /* trouvé un fichier comme ça, alors... */
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
Image_HAM=0;
|
||||
|
||||
if ( (!File_error) && (nb_colors>=2) && (nb_colors<=256) )
|
||||
{
|
||||
byte real_bit_planes = header.BitPlanes;
|
||||
|
||||
if (header.Mask==1)
|
||||
header.BitPlanes++;
|
||||
|
||||
// Deluxe paint le fait... alors on le fait...
|
||||
Back_color=header.Transp_col;
|
||||
|
||||
if (Config.Clear_palette)
|
||||
memset(context->Palette,0,sizeof(T_Palette));
|
||||
// On peut maintenant charger la nouvelle palette
|
||||
if (Read_bytes(IFF_file,context->Palette,3*nb_colors))
|
||||
{
|
||||
if (Image_HAM)
|
||||
@ -685,296 +683,294 @@ void Load_IFF(T_IO_Context * context)
|
||||
Palette_64_to_256(context->Palette);
|
||||
}
|
||||
|
||||
// On lit l'octet de padding du CMAP si la taille est impaire
|
||||
if (nb_colors&1)
|
||||
section_size -= 3*nb_colors;
|
||||
while(section_size > 0) // Read padding bytes
|
||||
{
|
||||
if (Read_byte(IFF_file,&temp_byte))
|
||||
File_error=20;
|
||||
|
||||
// Keep reading sections until we find the body
|
||||
while (1)
|
||||
{
|
||||
if (! Read_bytes(IFF_file,section,4))
|
||||
{
|
||||
File_error=46;
|
||||
break;
|
||||
}
|
||||
// Found body : stop searching
|
||||
if (!memcmp(section,"BODY",4))
|
||||
break;
|
||||
else if (!memcmp(section,"CRNG",4))
|
||||
{
|
||||
// Handle CRNG
|
||||
|
||||
// The content of a CRNG is as follows:
|
||||
word padding;
|
||||
word rate;
|
||||
word flags;
|
||||
byte min_col;
|
||||
byte max_col;
|
||||
//
|
||||
if ( (Read_dword_be(IFF_file,§ion_size))
|
||||
&& (Read_word_be(IFF_file,&padding))
|
||||
&& (Read_word_be(IFF_file,&rate))
|
||||
&& (Read_word_be(IFF_file,&flags))
|
||||
&& (Read_byte(IFF_file,&min_col))
|
||||
&& (Read_byte(IFF_file,&max_col)))
|
||||
{
|
||||
if (section_size == 8 && min_col != max_col)
|
||||
{
|
||||
// Valid cycling range
|
||||
if (max_col<min_col)
|
||||
SWAP_BYTES(min_col,max_col)
|
||||
|
||||
context->Cycle_range[context->Color_cycles].Start=min_col;
|
||||
context->Cycle_range[context->Color_cycles].End=max_col;
|
||||
context->Cycle_range[context->Color_cycles].Inverse=(flags&2)?1:0;
|
||||
context->Cycle_range[context->Color_cycles].Speed=(flags&1) ? rate/78 : 0;
|
||||
|
||||
context->Color_cycles++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
File_error=47;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// ignore any number of unknown sections
|
||||
if (!IFF_Skip_section())
|
||||
{
|
||||
File_error=48;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
section_size--;
|
||||
}
|
||||
|
||||
if ( !File_error )
|
||||
}
|
||||
else
|
||||
File_error=1;
|
||||
}
|
||||
else if (memcmp(section,"CRNG",4) == 0)
|
||||
{
|
||||
// The content of a CRNG is as follows:
|
||||
word padding;
|
||||
word rate;
|
||||
word flags;
|
||||
byte min_col;
|
||||
byte max_col;
|
||||
if ( (Read_word_be(IFF_file,&padding))
|
||||
&& (Read_word_be(IFF_file,&rate))
|
||||
&& (Read_word_be(IFF_file,&flags))
|
||||
&& (Read_byte(IFF_file,&min_col))
|
||||
&& (Read_byte(IFF_file,&max_col)))
|
||||
{
|
||||
if (section_size == 8 && min_col != max_col)
|
||||
{
|
||||
Read_dword_be(IFF_file,§ion_size);
|
||||
context->Width = header.Width;
|
||||
context->Height = header.Height;
|
||||
// Valid cycling range
|
||||
if (max_col<min_col)
|
||||
SWAP_BYTES(min_col,max_col)
|
||||
|
||||
Original_screen_X = header.X_screen;
|
||||
Original_screen_Y = header.Y_screen;
|
||||
context->Cycle_range[context->Color_cycles].Start=min_col;
|
||||
context->Cycle_range[context->Color_cycles].End=max_col;
|
||||
context->Cycle_range[context->Color_cycles].Inverse=(flags&2)?1:0;
|
||||
context->Cycle_range[context->Color_cycles].Speed=(flags&1) ? rate/78 : 0;
|
||||
|
||||
Pre_load(context, context->Width,context->Height,file_size,iff_format,PIXEL_SIMPLE,0);
|
||||
context->Background_transparent = header.Mask == 2;
|
||||
context->Transparent_color = context->Background_transparent ? header.Transp_col : 0;
|
||||
context->Color_cycles++;
|
||||
}
|
||||
}
|
||||
else
|
||||
File_error=47;
|
||||
}
|
||||
else if (memcmp(section, "BODY", 4) == 0)
|
||||
{
|
||||
Original_screen_X = header.X_screen;
|
||||
Original_screen_Y = header.Y_screen;
|
||||
|
||||
if (context->Type == CONTEXT_MAIN_IMAGE)
|
||||
{
|
||||
Main.backups->Pages->Image_mode = IMAGE_MODE_ANIMATION;
|
||||
Update_screen_targets();
|
||||
}
|
||||
if (File_error==0)
|
||||
{
|
||||
if (!memcmp(format,"ILBM",4)) // "ILBM": InterLeaved BitMap
|
||||
Pre_load(context, header.Width, header.Height, file_size, iff_format, PIXEL_SIMPLE, 0);
|
||||
context->Background_transparent = header.Mask == 2;
|
||||
context->Transparent_color = context->Background_transparent ? header.Transp_col : 0;
|
||||
|
||||
if (context->Type == CONTEXT_MAIN_IMAGE)
|
||||
{
|
||||
Main.backups->Pages->Image_mode = IMAGE_MODE_ANIMATION;
|
||||
Update_screen_targets();
|
||||
}
|
||||
|
||||
if (!memcmp(format,"ILBM",4)) // "ILBM": InterLeaved BitMap
|
||||
{
|
||||
// compute row size
|
||||
real_line_size = (context->Width+15) & ~15;
|
||||
plane_line_size = real_line_size >> 3; // 8bits per byte
|
||||
line_size = plane_line_size * header.BitPlanes;
|
||||
|
||||
switch(header.Compression)
|
||||
{
|
||||
case 0: // uncompressed
|
||||
IFF_buffer=(byte *)malloc(line_size);
|
||||
for (y_pos=0; ((y_pos<context->Height) && (!File_error)); y_pos++)
|
||||
{
|
||||
// Calcul de la taille d'une ligne ILBM (pour les images ayant des dimensions exotiques)
|
||||
real_line_size = (context->Width+15) & ~15;
|
||||
plane_line_size = real_line_size >> 3; // 8bits per byte
|
||||
line_size = plane_line_size * header.BitPlanes;
|
||||
|
||||
switch(header.Compression)
|
||||
{
|
||||
case 0: // non compressé
|
||||
IFF_buffer=(byte *)malloc(line_size);
|
||||
for (y_pos=0; ((y_pos<context->Height) && (!File_error)); y_pos++)
|
||||
{
|
||||
if (Read_bytes(IFF_file,IFF_buffer,line_size))
|
||||
Draw_IFF_line(context, y_pos,real_line_size, header.BitPlanes);
|
||||
else
|
||||
File_error=21;
|
||||
}
|
||||
free(IFF_buffer);
|
||||
IFF_buffer = NULL;
|
||||
break;
|
||||
case 1: // compressé packbits (Amiga)
|
||||
/*Init_lecture();*/
|
||||
|
||||
IFF_buffer=(byte *)malloc(line_size);
|
||||
|
||||
for (y_pos=0; ((y_pos<context->Height) && (!File_error)); y_pos++)
|
||||
{
|
||||
for (x_pos=0; ((x_pos<line_size) && (!File_error)); )
|
||||
{
|
||||
if(Read_byte(IFF_file, &temp_byte)!=1)
|
||||
{
|
||||
File_error=22;
|
||||
break;
|
||||
}
|
||||
// Si temp_byte > 127 alors il faut répéter 256-'temp_byte' fois la couleur de l'octet suivant
|
||||
// Si temp_byte <= 127 alors il faut afficher directement les 'temp_byte' octets suivants
|
||||
if (temp_byte>127)
|
||||
{
|
||||
if(Read_byte(IFF_file, &color)!=1)
|
||||
{
|
||||
File_error=23;
|
||||
break;
|
||||
}
|
||||
b256=(short)(256-temp_byte);
|
||||
for (counter=0; counter<=b256; counter++)
|
||||
if (x_pos<line_size)
|
||||
IFF_buffer[x_pos++]=color;
|
||||
else
|
||||
File_error=24;
|
||||
}
|
||||
else
|
||||
for (counter=0; counter<=(short)(temp_byte); counter++)
|
||||
if (x_pos>=line_size || Read_byte(IFF_file, &(IFF_buffer[x_pos++]))!=1)
|
||||
File_error=25;
|
||||
}
|
||||
if (!File_error)
|
||||
Draw_IFF_line(context, y_pos,real_line_size,header.BitPlanes);
|
||||
}
|
||||
|
||||
free(IFF_buffer);
|
||||
IFF_buffer = NULL;
|
||||
/*Close_lecture();*/
|
||||
break;
|
||||
case 2: // compressé vertical RLE (Atari ST)
|
||||
IFF_buffer=(byte *)malloc(line_size*context->Height);
|
||||
plane_line_size = real_line_size >> 3;
|
||||
for (plane = 0; plane < header.BitPlanes && !File_error; plane++)
|
||||
{
|
||||
word cmd_count;
|
||||
word cmd;
|
||||
signed char * commands;
|
||||
word count;
|
||||
|
||||
y_pos = 0; x_pos = 0;
|
||||
if (!IFF_Wait_for("VDAT"))
|
||||
{
|
||||
File_error = 30;
|
||||
break;
|
||||
}
|
||||
Read_dword_be(IFF_file,§ion_size);
|
||||
Read_word_be(IFF_file,&cmd_count);
|
||||
cmd_count -= 2;
|
||||
commands = (signed char *)malloc(cmd_count);
|
||||
if (!Read_bytes(IFF_file,commands,cmd_count))
|
||||
{
|
||||
File_error = 31;
|
||||
break;
|
||||
}
|
||||
for (cmd = 0; cmd < cmd_count && x_pos < plane_line_size; cmd++)
|
||||
{
|
||||
if (commands[cmd] <= 0)
|
||||
{ // cmd=0 : load count from data, COPY
|
||||
// cmd < 0 : count = -cmd, COPY
|
||||
if (commands[cmd] == 0)
|
||||
Read_word_be(IFF_file,&count);
|
||||
else
|
||||
count = -commands[cmd];
|
||||
while (count-- > 0 && x_pos < plane_line_size)
|
||||
{
|
||||
Read_bytes(IFF_file,IFF_buffer+x_pos+y_pos*line_size+plane*plane_line_size,2);
|
||||
if(++y_pos >= context->Height)
|
||||
{
|
||||
y_pos = 0;
|
||||
x_pos += 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (commands[cmd] >= 1)
|
||||
{ // cmd=1 : load count from data, RLE
|
||||
// cmd >1 : count = cmd, RLE
|
||||
byte data[2];
|
||||
if (commands[cmd] == 1)
|
||||
Read_word_be(IFF_file,&count);
|
||||
else
|
||||
count = (word)commands[cmd];
|
||||
Read_bytes(IFF_file,data,2);
|
||||
while (count-- > 0 && x_pos < plane_line_size)
|
||||
{
|
||||
memcpy(IFF_buffer+x_pos+y_pos*line_size+plane*plane_line_size,data,2);
|
||||
if (++y_pos >= context->Height)
|
||||
{
|
||||
y_pos = 0;
|
||||
x_pos += 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
free(commands);
|
||||
}
|
||||
if (!File_error)
|
||||
{
|
||||
byte * save_IFF_buffer = IFF_buffer;
|
||||
for (y_pos = 0; y_pos < context->Height; y_pos++)
|
||||
{
|
||||
Draw_IFF_line(context,y_pos,real_line_size,real_bit_planes);
|
||||
IFF_buffer += line_size;
|
||||
}
|
||||
IFF_buffer = save_IFF_buffer;
|
||||
}
|
||||
free(IFF_buffer);
|
||||
IFF_buffer = NULL;
|
||||
break;
|
||||
default: // compression non reconnue
|
||||
File_error = 32;
|
||||
}
|
||||
if (Read_bytes(IFF_file,IFF_buffer,line_size))
|
||||
Draw_IFF_line(context, y_pos,real_line_size, header.BitPlanes);
|
||||
else
|
||||
File_error=21;
|
||||
}
|
||||
else // "PBM ": Planar(?) BitMap
|
||||
free(IFF_buffer);
|
||||
IFF_buffer = NULL;
|
||||
break;
|
||||
case 1: // packbits compression (Amiga)
|
||||
IFF_buffer=(byte *)malloc(line_size);
|
||||
for (y_pos=0; ((y_pos<context->Height) && (!File_error)); y_pos++)
|
||||
{
|
||||
real_line_size=context->Width+(context->Width&1);
|
||||
|
||||
if (!header.Compression)
|
||||
{ // non compressé
|
||||
IFF_buffer=(byte *)malloc(real_line_size);
|
||||
for (y_pos=0; ((y_pos<context->Height) && (!File_error)); y_pos++)
|
||||
for (x_pos=0; ((x_pos<line_size) && (!File_error)); )
|
||||
{
|
||||
if(Read_byte(IFF_file, &temp_byte)!=1)
|
||||
{
|
||||
if (Read_bytes(IFF_file,IFF_buffer,real_line_size))
|
||||
for (x_pos=0; x_pos<context->Width; x_pos++)
|
||||
Set_pixel(context, x_pos,y_pos,IFF_buffer[x_pos]);
|
||||
else
|
||||
File_error=26;
|
||||
File_error=22;
|
||||
break;
|
||||
}
|
||||
free(IFF_buffer);
|
||||
IFF_buffer = NULL;
|
||||
// Si temp_byte > 127 alors il faut répéter 256-'temp_byte' fois la couleur de l'octet suivant
|
||||
// Si temp_byte <= 127 alors il faut afficher directement les 'temp_byte' octets suivants
|
||||
if (temp_byte>127)
|
||||
{
|
||||
if(Read_byte(IFF_file, &color)!=1)
|
||||
{
|
||||
File_error=23;
|
||||
break;
|
||||
}
|
||||
b256=(short)(256-temp_byte);
|
||||
for (counter=0; counter<=b256; counter++)
|
||||
if (x_pos<line_size)
|
||||
IFF_buffer[x_pos++]=color;
|
||||
else
|
||||
File_error=24;
|
||||
}
|
||||
else
|
||||
for (counter=0; counter<=(short)(temp_byte); counter++)
|
||||
if (x_pos>=line_size || Read_byte(IFF_file, &(IFF_buffer[x_pos++]))!=1)
|
||||
File_error=25;
|
||||
}
|
||||
if (!File_error)
|
||||
Draw_IFF_line(context, y_pos,real_line_size,header.BitPlanes);
|
||||
}
|
||||
free(IFF_buffer);
|
||||
IFF_buffer = NULL;
|
||||
break;
|
||||
case 2: // vertical RLE compression (Atari ST)
|
||||
IFF_buffer=(byte *)calloc(line_size*context->Height, 1);
|
||||
if (IFF_buffer == NULL)
|
||||
{
|
||||
File_error=1;
|
||||
Warning("Failed to allocate memory for IFF decoding");
|
||||
}
|
||||
plane_line_size = real_line_size >> 3;
|
||||
for (plane = 0; plane < header.BitPlanes && !File_error; plane++)
|
||||
{
|
||||
word cmd_count;
|
||||
word cmd;
|
||||
signed char * commands;
|
||||
word count;
|
||||
|
||||
y_pos = 0; x_pos = 0;
|
||||
if (!IFF_Wait_for("VDAT"))
|
||||
{
|
||||
if (plane == 0) // don't cancel loading if at least 1 bitplane has been loaded
|
||||
File_error = 30;
|
||||
break;
|
||||
}
|
||||
Read_dword_be(IFF_file,§ion_size);
|
||||
Read_word_be(IFF_file,&cmd_count);
|
||||
cmd_count -= 2;
|
||||
commands = (signed char *)malloc(cmd_count);
|
||||
if (!Read_bytes(IFF_file,commands,cmd_count))
|
||||
{
|
||||
File_error = 31;
|
||||
break;
|
||||
}
|
||||
section_size -= (cmd_count + 2);
|
||||
for (cmd = 0; cmd < cmd_count && x_pos < plane_line_size && section_size > 0; cmd++)
|
||||
{
|
||||
if (commands[cmd] <= 0)
|
||||
{ // cmd=0 : load count from data, COPY
|
||||
// cmd < 0 : count = -cmd, COPY
|
||||
if (commands[cmd] == 0)
|
||||
{
|
||||
Read_word_be(IFF_file,&count);
|
||||
section_size -= 2;
|
||||
}
|
||||
else
|
||||
count = -commands[cmd];
|
||||
while (count-- > 0 && x_pos < plane_line_size && section_size > 0)
|
||||
{
|
||||
Read_bytes(IFF_file,IFF_buffer+x_pos+y_pos*line_size+plane*plane_line_size,2);
|
||||
section_size -= 2;
|
||||
if(++y_pos >= context->Height)
|
||||
{
|
||||
y_pos = 0;
|
||||
x_pos += 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (commands[cmd] >= 1)
|
||||
{ // cmd=1 : load count from data, RLE
|
||||
// cmd >1 : count = cmd, RLE
|
||||
byte data[2];
|
||||
if (commands[cmd] == 1)
|
||||
{
|
||||
Read_word_be(IFF_file,&count);
|
||||
section_size -= 2;
|
||||
}
|
||||
else
|
||||
count = (word)commands[cmd];
|
||||
if (section_size == 0)
|
||||
break;
|
||||
Read_bytes(IFF_file,data,2);
|
||||
section_size -= 2;
|
||||
while (count-- > 0 && x_pos < plane_line_size)
|
||||
{
|
||||
memcpy(IFF_buffer+x_pos+y_pos*line_size+plane*plane_line_size,data,2);
|
||||
if(++y_pos >= context->Height)
|
||||
{
|
||||
y_pos = 0;
|
||||
x_pos += 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(cmd < (cmd_count-1) || section_size > 0)
|
||||
Warning("Early end in VDAT chunk");
|
||||
if (section_size > 0)
|
||||
fseek(IFF_file, section_size, SEEK_CUR); // skip bytes
|
||||
free(commands);
|
||||
}
|
||||
if (!File_error)
|
||||
{
|
||||
byte * save_IFF_buffer = IFF_buffer;
|
||||
for (y_pos = 0; y_pos < context->Height; y_pos++)
|
||||
{
|
||||
Draw_IFF_line(context,y_pos,real_line_size,real_bit_planes);
|
||||
IFF_buffer += line_size;
|
||||
}
|
||||
IFF_buffer = save_IFF_buffer;
|
||||
}
|
||||
free(IFF_buffer);
|
||||
IFF_buffer = NULL;
|
||||
break;
|
||||
default:
|
||||
Warning("Unknown IFF compression");
|
||||
File_error = 32;
|
||||
}
|
||||
}
|
||||
else // "PBM ": Planar(?) BitMap
|
||||
{
|
||||
real_line_size=context->Width+(context->Width&1);
|
||||
|
||||
if (!header.Compression)
|
||||
{ // non compressé
|
||||
IFF_buffer=(byte *)malloc(real_line_size);
|
||||
for (y_pos=0; ((y_pos<context->Height) && (!File_error)); y_pos++)
|
||||
{
|
||||
if (Read_bytes(IFF_file,IFF_buffer,real_line_size))
|
||||
for (x_pos=0; x_pos<context->Width; x_pos++)
|
||||
Set_pixel(context, x_pos,y_pos,IFF_buffer[x_pos]);
|
||||
else
|
||||
File_error=26;
|
||||
}
|
||||
free(IFF_buffer);
|
||||
IFF_buffer = NULL;
|
||||
}
|
||||
else
|
||||
{ // compressé
|
||||
/*Init_lecture();*/
|
||||
for (y_pos=0; ((y_pos<context->Height) && (!File_error)); y_pos++)
|
||||
{
|
||||
for (x_pos=0; ((x_pos<real_line_size) && (!File_error)); )
|
||||
{
|
||||
if(Read_byte(IFF_file, &temp_byte)!=1)
|
||||
{
|
||||
File_error=27;
|
||||
break;
|
||||
}
|
||||
if (temp_byte>127)
|
||||
{
|
||||
if(Read_byte(IFF_file, &color)!=1)
|
||||
{
|
||||
File_error=28;
|
||||
break;
|
||||
}
|
||||
b256=256-temp_byte;
|
||||
for (counter=0; counter<=b256; counter++)
|
||||
Set_pixel(context, x_pos++,y_pos,color);
|
||||
}
|
||||
else
|
||||
{ // compressé
|
||||
/*Init_lecture();*/
|
||||
for (y_pos=0; ((y_pos<context->Height) && (!File_error)); y_pos++)
|
||||
for (counter=0; counter<=temp_byte; counter++)
|
||||
{
|
||||
for (x_pos=0; ((x_pos<real_line_size) && (!File_error)); )
|
||||
byte byte_read=0;
|
||||
if(Read_byte(IFF_file, &byte_read)!=1)
|
||||
{
|
||||
if(Read_byte(IFF_file, &temp_byte)!=1)
|
||||
{
|
||||
File_error=27;
|
||||
break;
|
||||
}
|
||||
if (temp_byte>127)
|
||||
{
|
||||
if(Read_byte(IFF_file, &color)!=1)
|
||||
{
|
||||
File_error=28;
|
||||
break;
|
||||
}
|
||||
b256=256-temp_byte;
|
||||
for (counter=0; counter<=b256; counter++)
|
||||
Set_pixel(context, x_pos++,y_pos,color);
|
||||
}
|
||||
else
|
||||
for (counter=0; counter<=temp_byte; counter++)
|
||||
{
|
||||
byte byte_read=0;
|
||||
if(Read_byte(IFF_file, &byte_read)!=1)
|
||||
{
|
||||
File_error=29;
|
||||
break;
|
||||
}
|
||||
Set_pixel(context, x_pos++,y_pos,byte_read);
|
||||
}
|
||||
File_error=29;
|
||||
break;
|
||||
}
|
||||
Set_pixel(context, x_pos++,y_pos,byte_read);
|
||||
}
|
||||
/*Close_lecture();*/
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
char tmp_msg[60];
|
||||
// skip section
|
||||
snprintf(tmp_msg, sizeof(tmp_msg), "Skip unknown section '%.4s' of %u bytes", section, section_size);
|
||||
Warning(tmp_msg);
|
||||
fseek(IFF_file, section_size, SEEK_CUR);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
while (!File_error && is_anim)
|
||||
{
|
||||
@ -1000,26 +996,12 @@ void Load_IFF(T_IO_Context * context)
|
||||
fseek(IFF_file, delta_size + (delta_size & 1), SEEK_CUR);
|
||||
}
|
||||
*/
|
||||
}
|
||||
}
|
||||
else
|
||||
Set_file_error(2);
|
||||
}
|
||||
else
|
||||
{
|
||||
File_error=1;
|
||||
}
|
||||
}
|
||||
else
|
||||
Set_file_error(1);
|
||||
}
|
||||
else
|
||||
File_error=1;
|
||||
}
|
||||
else
|
||||
File_error=1;
|
||||
|
||||
fclose(IFF_file);
|
||||
IFF_file = NULL;
|
||||
}
|
||||
else
|
||||
File_error=1;
|
||||
@ -1283,6 +1265,7 @@ void Save_IFF(T_IO_Context * context)
|
||||
}
|
||||
}
|
||||
fclose(IFF_file);
|
||||
IFF_file = NULL;
|
||||
|
||||
if (!File_error)
|
||||
{
|
||||
@ -1310,6 +1293,7 @@ void Save_IFF(T_IO_Context * context)
|
||||
Write_dword_be(IFF_file,file_size-8);
|
||||
|
||||
fclose(IFF_file);
|
||||
IFF_file = NULL;
|
||||
|
||||
if (File_error)
|
||||
remove(filename);
|
||||
@ -1318,6 +1302,7 @@ void Save_IFF(T_IO_Context * context)
|
||||
{
|
||||
File_error=1;
|
||||
fclose(IFF_file);
|
||||
IFF_file = NULL;
|
||||
remove(filename);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user