Added minimal support of ANIM format as part of the LBM loader : The first frame can be read.

git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@1923 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
Yves Rizoud 2012-03-07 19:44:37 +00:00
parent 341fa77a93
commit b435ff2582

View File

@ -256,33 +256,49 @@ void Test_LBM(T_IO_Context * context)
Get_full_filename(filename, context->File_name, context->File_directory); Get_full_filename(filename, context->File_name, context->File_directory);
File_error=0; File_error=1;
if ((LBM_file=fopen(filename, "rb"))) if ((LBM_file=fopen(filename, "rb")))
{ {
if (! Read_bytes(LBM_file,section,4)) do // Dummy loop, so that all breaks jump to end.
File_error=1;
else
if (memcmp(section,"FORM",4))
File_error=1;
else
{ {
Read_dword_be(LBM_file, &dummy); if (! Read_bytes(LBM_file,section,4))
break;
if (memcmp(section,"FORM",4))
break;
if (! Read_dword_be(LBM_file, &dummy))
break;
// On aurait pu vérifier que ce long est égal à la taille // On aurait pu vérifier que ce long est égal à la taille
// du fichier - 8, mais ça aurait interdit de charger des // du fichier - 8, mais ça aurait interdit de charger des
// fichiers tronqués (et déjà que c'est chiant de perdre // fichiers tronqués (et déjà que c'est chiant de perdre
// une partie du fichier il faut quand même pouvoir en // une partie du fichier il faut quand même pouvoir en
// garder un peu... Sinon, moi je pleure :'( !!! ) // garder un peu... Sinon, moi je pleure :'( !!! )
if (! Read_bytes(LBM_file,format,4)) if (! Read_bytes(LBM_file,format,4))
File_error=1; break;
else
if ( (memcmp(format,"ILBM",4)) && (memcmp(format,"PBM ",4)) ) if (!memcmp(format,"ANIM",4))
File_error=1; {
// An ANIM header: need to check that it encloses an ILBM
if (! Read_bytes(LBM_file,section,4))
break;
if (memcmp(section,"FORM",4))
break;
if (! Read_dword_be(LBM_file, &dummy))
break;
if (! Read_bytes(LBM_file,format,4))
break;
} }
if ( (memcmp(format,"ILBM",4)) && (memcmp(format,"PBM ",4)) )
break;
// If we reach this part, file is indeed ILBM or ANIM
File_error=0;
} while (0);
fclose(LBM_file); fclose(LBM_file);
} }
else
File_error=1;
} }
@ -551,6 +567,7 @@ void Load_LBM(T_IO_Context * context)
byte color; byte color;
long file_size; long file_size;
dword dummy; dword dummy;
byte is_anim=0;
Get_full_filename(filename, context->File_name, context->File_directory); Get_full_filename(filename, context->File_name, context->File_directory);
@ -560,10 +577,20 @@ void Load_LBM(T_IO_Context * context)
{ {
file_size=File_length_file(LBM_file); file_size=File_length_file(LBM_file);
// On avance dans le fichier (pas besoin de tester ce qui l'a déjà été) // FORM + size(4)
Read_bytes(LBM_file,section,4);
Read_dword_be(LBM_file,&dummy);
Read_bytes(LBM_file,format,4);
if (!memcmp(format,"ANIM",4))
{
is_anim=1;
// Skip a bit, brother
Read_bytes(LBM_file,section,4); Read_bytes(LBM_file,section,4);
Read_dword_be(LBM_file,&dummy); Read_dword_be(LBM_file,&dummy);
Read_bytes(LBM_file,format,4); Read_bytes(LBM_file,format,4);
}
if (!LBM_Wait_for((byte *)"BMHD")) if (!LBM_Wait_for((byte *)"BMHD"))
File_error=1; File_error=1;
Read_dword_be(LBM_file,&dummy); Read_dword_be(LBM_file,&dummy);
@ -705,6 +732,11 @@ void Load_LBM(T_IO_Context * context)
Original_screen_Y = header.Y_screen; Original_screen_Y = header.Y_screen;
Pre_load(context, context->Width,context->Height,file_size,FORMAT_LBM,PIXEL_SIMPLE,0); Pre_load(context, context->Width,context->Height,file_size,FORMAT_LBM,PIXEL_SIMPLE,0);
if (context->Type == CONTEXT_MAIN_IMAGE)
{
Main_backups->Pages->Image_mode = IMAGE_MODE_ANIMATION;
Update_screen_targets();
}
if (File_error==0) if (File_error==0)
{ {
if (!memcmp(format,"ILBM",4)) // "ILBM": InterLeaved BitMap if (!memcmp(format,"ILBM",4)) // "ILBM": InterLeaved BitMap
@ -836,6 +868,31 @@ void Load_LBM(T_IO_Context * context)
/*Close_lecture();*/ /*Close_lecture();*/
} }
} }
/*
while (!File_error && is_anim)
{
dword delta_size;
// Just loaded the first image successfully : now keep reading
// FORM + size(4)
if (!Read_bytes(LBM_file,section,4))
break;
Read_dword_be(LBM_file,&dummy);
// ILBM, hopefully
Read_bytes(LBM_file,format,4);
if (!LBM_Wait_for((byte *)"DLTA"))
{
File_error=1;
break;
}
Set_loading_layer(context, context->Current_layer+1);
Read_dword_be(LBM_file,&delta_size);
fseek(LBM_file, delta_size + (delta_size & 1), SEEK_CUR);
}
*/
} }
} }
else else