Load_IFF() support for ANIM with sound chunks

This commit is contained in:
Thomas Bernard 2018-12-14 15:54:45 +01:00
parent 93bc0e6459
commit c86babeb35
No known key found for this signature in database
GPG Key ID: 0FF11B67A5C0863C

View File

@ -291,61 +291,64 @@ void Test_IFF(FILE * IFF_file, const char *sub_type)
File_error=1; File_error=1;
do // Dummy loop, so that all breaks jump to end. if (! Read_bytes(IFF_file,section,4))
return;
if (memcmp(section,"FORM",4))
return;
if (! Read_dword_be(IFF_file, &dummy))
return;
// On aurait pu vérifier que ce long est égal à la taille
// 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
// garder un peu... Sinon, moi je pleure :'( !!! )
if (! Read_bytes(IFF_file,format,4))
return;
if (!memcmp(format,"ANIM",4))
{
dword size;
// An ANIM header: need to check that it encloses an image
do
{ {
if (! Read_bytes(IFF_file,section,4)) if (! Read_bytes(IFF_file,section,4))
break; return;
if (memcmp(section,"FORM",4)) if (memcmp(section,"FORM",4))
break; return;
if (! Read_dword_be(IFF_file, &size))
if (! Read_dword_be(IFF_file, &dummy)) return;
break;
// On aurait pu vérifier que ce long est égal à la taille
// 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
// garder un peu... Sinon, moi je pleure :'( !!! )
if (! Read_bytes(IFF_file,format,4)) if (! Read_bytes(IFF_file,format,4))
break; return;
if (fseek(IFF_file, size - 4, SEEK_CUR) < 0)
if (!memcmp(format,"ANIM",4)) return;
{ }
// An ANIM header: need to check that it encloses an image while(0 == memcmp(format, "8SVX", 4)); // skip sound frames
if (! Read_bytes(IFF_file,section,4)) }
break; else if(memcmp(format,"DPST",4) == 0)
if (memcmp(section,"FORM",4)) {
break; if (! Read_bytes(IFF_file,section,4))
if (! Read_dword_be(IFF_file, &dummy)) return;
break; if (memcmp(section, "DPAH", 4) != 0)
if (! Read_bytes(IFF_file,format,4)) return;
break; if (! Read_dword_be(IFF_file, &dummy))
} return;
else if(memcmp(format,"DPST",4) == 0) fseek(IFF_file, dummy, SEEK_CUR);
{ if (! Read_bytes(IFF_file,section,4))
if (! Read_bytes(IFF_file,section,4)) return;
break; if (memcmp(section,"FORM",4))
if (memcmp(section, "DPAH", 4) != 0) return;
break; if (! Read_dword_be(IFF_file, &dummy))
if (! Read_dword_be(IFF_file, &dummy)) return;
break; if (! Read_bytes(IFF_file,format,4))
fseek(IFF_file, dummy, SEEK_CUR); return;
if (! Read_bytes(IFF_file,section,4)) }
break; if ( memcmp(format,sub_type,4))
if (memcmp(section,"FORM",4)) return;
break;
if (! Read_dword_be(IFF_file, &dummy)) // If we reach this part, file is indeed ILBM/PBM or ANIM
break; File_error=0;
if (! Read_bytes(IFF_file,format,4))
break;
}
if ( memcmp(format,sub_type,4))
break;
// If we reach this part, file is indeed ILBM/PBM or ANIM
File_error=0;
} while (0);
} }
void Test_PBM(T_IO_Context * context, FILE * f) void Test_PBM(T_IO_Context * context, FILE * f)
@ -966,8 +969,17 @@ void Load_IFF(T_IO_Context * context)
{ {
// Skip a bit, brother // Skip a bit, brother
Read_bytes(IFF_file,section,4); Read_bytes(IFF_file,section,4);
Read_dword_be(IFF_file,&dummy); Read_dword_be(IFF_file,&section_size);
Read_bytes(IFF_file,format,4); Read_bytes(IFF_file,format,4);
while (0 == memcmp(format, "8SVX", 4))
{
GFX2_Log(GFX2_DEBUG, "IFF : skip sound %.4s %u bytes\n", format, section_size);
if (fseek(IFF_file, section_size - 4, SEEK_CUR) < 0)
break;
Read_bytes(IFF_file,section,4);
Read_dword_be(IFF_file,&section_size);
Read_bytes(IFF_file,format,4);
}
} }
else if(memcmp(format,"DPST",4)==0) else if(memcmp(format,"DPST",4)==0)
{ {
@ -1002,9 +1014,7 @@ void Load_IFF(T_IO_Context * context)
iff_format = FORMAT_ACBM; iff_format = FORMAT_ACBM;
else else
{ {
char tmp_msg[60]; GFX2_Log(GFX2_WARNING, "Unknown IFF format '%.4s'\n", format);
snprintf(tmp_msg, sizeof(tmp_msg), "Unknown IFF format '%.4s'", format);
Warning(tmp_msg);
File_error=1; File_error=1;
} }
@ -1068,6 +1078,12 @@ void Load_IFF(T_IO_Context * context)
File_error = 1; File_error = 1;
break; break;
} }
GFX2_Log(GFX2_DEBUG, "IFF BMHD : origin (%u,%u) size %ux%u BitPlanes=%u Mask=%u Compression=%u\n",
header.X_org, header.Y_org, header.Width, header.Height,
header.BitPlanes, header.Mask, header.Compression);
GFX2_Log(GFX2_DEBUG, " Transp_col=#%u aspect ratio %u/%u screen size %ux%u\n",
header.Transp_col, header.X_aspect, header.Y_aspect,
header.X_screen, header.Y_screen);
real_bit_planes = header.BitPlanes; real_bit_planes = header.BitPlanes;
stored_bit_planes = header.BitPlanes; stored_bit_planes = header.BitPlanes;
if (header.Mask==1) if (header.Mask==1)
@ -1196,7 +1212,7 @@ void Load_IFF(T_IO_Context * context)
continue; continue;
if (plane >= real_bit_planes) if (plane >= real_bit_planes)
{ {
Warning("too much bitplanes in DLTA data"); GFX2_Log(GFX2_WARNING, "IFF : too much bitplanes in DLTA data %u >= %u (frame #%u/%u)\n", plane, real_bit_planes, current_frame + 1, frame_count);
break; break;
} }
while (current_offset < offsets[plane]) while (current_offset < offsets[plane])
@ -1372,7 +1388,7 @@ void Load_IFF(T_IO_Context * context)
} }
else else
{ {
Warning("Unsupported compression type in ILBM DLTA chunk"); GFX2_Log(GFX2_INFO, "IFF DLTA : Unsupported compression type %u\n", aheader.operation);
} }
if (File_error == 0) if (File_error == 0)
@ -1504,9 +1520,10 @@ void Load_IFF(T_IO_Context * context)
File_error = 1; File_error = 1;
break; break;
} }
GFX2_Log(GFX2_DEBUG, "IFF CMAP : %u colors (header.BitPlanes=%u)\n", nb_colors, header.BitPlanes);
if (current_frame != 0) if (current_frame != 0)
Warning("One CMAP per frame is not supported"); GFX2_Log(GFX2_WARNING, "IFF : One CMAP per frame is not supported (frame #%u/%u)\n", current_frame + 1, frame_count);
if ((header.BitPlanes==6 && nb_colors==16) || (header.BitPlanes==8 && nb_colors==64)) if ((header.BitPlanes==6 && nb_colors==16) || (header.BitPlanes==8 && nb_colors==64))
{ {
Image_HAM=header.BitPlanes; Image_HAM=header.BitPlanes;
@ -1566,6 +1583,7 @@ void Load_IFF(T_IO_Context * context)
&& (Read_byte(IFF_file,&min_col)) && (Read_byte(IFF_file,&min_col))
&& (Read_byte(IFF_file,&max_col))) && (Read_byte(IFF_file,&max_col)))
{ {
GFX2_Log(GFX2_DEBUG, "IFF CRNG : [#%u #%u] rate=%u flags=%04x\n", min_col, max_col, rate, flags);
if (section_size == 8 && min_col != max_col) if (section_size == 8 && min_col != max_col)
{ {
// Valid cycling range // Valid cycling range
@ -1574,7 +1592,7 @@ void Load_IFF(T_IO_Context * context)
if (context->Color_cycles >= 16) if (context->Color_cycles >= 16)
{ {
Warning("Maximum CRNG number is 16"); GFX2_Log(GFX2_INFO, "IFF CRNG : Maximum CRNG number is 16\n");
} }
else else
{ {
@ -2048,11 +2066,17 @@ void Load_IFF(T_IO_Context * context)
} }
else else
{ {
char tmp_msg[60];
// skip section // skip section
snprintf(tmp_msg, sizeof(tmp_msg), "Skip unknown section '%.4s' of %u bytes", section, section_size); GFX2_Log(GFX2_INFO, "IFF : Skip unknown section '%.4s' of %u bytes at offset %06X\n", section, section_size, ftell(IFF_file));
Warning(tmp_msg); if (section_size < 256)
fseek(IFF_file, (section_size+1)&~1, SEEK_CUR); {
byte buffer[256];
Read_bytes(IFF_file, buffer, (section_size+1)&~1);
GFX2_LogHexDump(GFX2_DEBUG, "", buffer, 0, (section_size+1)&~1);
}
else
fseek(IFF_file, (section_size+1)&~1, SEEK_CUR);
} }
} }
} }